Почему эта пользовательская функция bisect работает в бесконечном цикле?

У меня есть длинный скрипт, в котором я изначально использовал bisect in. Это было его частью (работало отлично и по назначению):

portfolios = [[1], [0.9], [0.8], [0.7], [0.6]] #Fills up list to avoid "index out of range" error later on in code
add_sharpe = [sharpe, name_a, weight_a, exchange_a, name_b, weight_b, exchange_b, name_c, weight_c, exchange_c]
for x in portfolios:
    if sharpe > x[0]:
        sharpes =  [i[0] for i in portfolios]
        if name_a not in x and name_b not in x and name_c not in x:
            print sharpe
            print sharpes
            print portfolios
            print add_sharpe
            position = reverse_bisect(sharpes, sharpe)
            print position
            portfolios.insert(position, add_sharpe)

Однако теперь мне понадобилась обратная биссектриса (в порядке убывания). К счастью, я нашел действительно хорошее решение этой .

Код для создания обратной биссектрисы выглядит следующим образом:

def reverse_bisect(a, x, lo=0, hi=None):
    if lo < 0:
        raise ValueError('lo must be non-negative')
    if hi is None:
        hi = len(a)
    while lo < hi:
        mid = (lo+hi)//2
        if x > a[mid]: hi = mid
        else: lo = mid+1
    return lo

Это работает очень хорошо, когда я тестировал его с помощью простых вычислений. Однако, когда я подключаю его к своему сценарию, он приводит к зависанию сценария в этот момент при запуске. Я понятия не имею, почему это происходит, поскольку я использую ту же логику, что и раньше, с bisect.bisect, которая отлично работала.

Вот что сейчас не работает:

        if name_a not in x and name_b not in x and name_c not in x:
            position = reverse_bisect(sharpes, sharpe)
            portfolios.insert(position, add_sharpe)

По какой-то причине кажется, что использование функции зацикливается на portfolios.insert(position, add_sharpe) без конца.

Выход:

[1, 0.9, 0.8, 0.7, 0.6] #print portfolios
[[1], [0.9], [0.8], [0.7], [0.6]] #print sharpes
[1.6275936902107178, "CARR'S GROUP  (CARR.L)", 0.9, 'LSE  ', 'Church & Dwight Co. Inc. (CHD)', 0.05, 'NYSE  ', 'NCC Group plc. (NCC.L)', 0.05, 'LSE  '] #print portfolios
0 #print position
1.62759369021 #print sharpe
[1.6275936902107178, 1, 0.9, 0.8, 0.7, 0.6] #print portfolios
[[1.6275936902107178, "CARR'S GROUP  (CARR.L)", 0.9, 'LSE  ', 'Church & Dwight Co. Inc. (CHD)', 0.05, 'NYSE  ', 'NCC Group plc. (NCC.L)', 0.05, 'LSE  '], [1], [0.9], [0.8], [0.7], [0.6]]
[1.6275936902107178, "CARR'S GROUP  (CARR.L)", 0.9, 'LSE  ', 'Church & Dwight Co. Inc. (CHD)', 0.05, 'NYSE  ', 'NCC Group plc. (NCC.L)', 0.05, 'LSE  ']
1
1.62759369021
[1.6275936902107178, 1.6275936902107178, 1, 0.9, 0.8, 0.7, 0.6]
[[1.6275936902107178, "CARR'S GROUP  (CARR.L)", 0.9, 'LSE  ', 'Church & Dwight Co. Inc. (CHD)', 0.05, 'NYSE  ', 'NCC Group plc. (NCC.L)', 0.05, 'LSE  '], [1.6275936902107178, "CARR'S GROUP  (CARR.L)", 0.9, 'LSE  ', 'Church & Dwight Co. Inc. (CHD)', 0.05, 'NYSE  ', 'NCC Group plc. (NCC.L)', 0.05, 'LSE  '], [1], [0.9], [0.8], [0.7], [0.6]]
[1.6275936902107178, "CARR'S GROUP  (CARR.L)", 0.9, 'LSE  ', 'Church & Dwight Co. Inc. (CHD)', 0.05, 'NYSE  ', 'NCC Group plc. (NCC.L)', 0.05, 'LSE  ']
2
1.62759369021
[1.6275936902107178, 1.6275936902107178, 1.6275936902107178, 1, 0.9, 0.8, 0.7, 0.6]
[[1.6275936902107178, "CARR'S GROUP  (CARR.L)", 0.9, 'LSE  ', 'Church & Dwight Co. Inc. (CHD)', 0.05, 'NYSE  ', 'NCC Group plc. (NCC.L)', 0.05, 'LSE  '], [1.6275936902107178, "CARR'S GROUP  (CARR.L)", 0.9, 'LSE  ', 'Church & Dwight Co. Inc. (CHD)', 0.05, 'NYSE  ', 'NCC Group plc. (NCC.L)', 0.05, 'LSE  '], [1.6275936902107178, "CARR'S GROUP  (CARR.L)", 0.9, 'LSE  ', 'Church & Dwight Co. Inc. (CHD)', 0.05, 'NYSE  ', 'NCC Group plc. (NCC.L)', 0.05, 'LSE  '], [1], [0.9], [0.8], [0.7], [0.6]]
[1.6275936902107178, "CARR'S GROUP  (CARR.L)", 0.9, 'LSE  ', 'Church & Dwight Co. Inc. (CHD)', 0.05, 'NYSE  ', 'NCC Group plc. (NCC.L)', 0.05, 'LSE  ']
3

person thefoxrocks    schedule 17.05.2015    source источник
comment
Какие типы sharpes и sharpe?   -  person Burhan Khalid    schedule 17.05.2015
comment
Создайте MCVE, демонстрирующий проблему. Поскольку мы понятия не имеем, что такое sharpes, sharpe, portfolios или add_sharpe, мы ничем не можем вам помочь.   -  person MattDMo    schedule 17.05.2015
comment
@BurhanKhalid добавил, мои извинения...   -  person thefoxrocks    schedule 17.05.2015
comment
Не ответ, но каждый раз, когда мне нужно написать метод деления пополам, я копирую этот пример реализации из C++: cplusplus.com/reference/algorithm/lower_bound   -  person Juan Lopes    schedule 17.05.2015
comment
@Juan Lopes спасибо за пример. Код, который у меня есть, работает хорошо, если вы его протестируете. Например, если l = [6,5,3,2,1] и reverse_bisect(l,4) будут работать   -  person thefoxrocks    schedule 17.05.2015


Ответы (1)


Я думаю, что вы вставляете в список, который вы повторяете. Например:

a = [1]

for x in a:
    a.insert(0, x)
    print a

Это поставит вас в цикл, где вы продолжаете вставлять 1 в a.

person dting    schedule 17.05.2015
comment
если быть точным, я использую .insert(), но да. У вас есть идеи, как просто добавить его один раз? - person thefoxrocks; 17.05.2015
comment
Я не могу сказать из вашего кода, откуда берутся какие-либо переменные и почему вы перебираете портфели. Код, который вы разместили, вложен в другой цикл? - person dting; 17.05.2015
comment
Я нашел решение. Мне пришлось создать новый список, и вместо того, чтобы вставить значение в тот же список, который я перебирал, я вставил его в новый список. Спасибо за вашу помощь! - person thefoxrocks; 17.05.2015