为什么这个自定义平分功能在无限循环中?

时间:2015-05-17 04:40:09

标签: python 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)

然而,现在我需要一个反向平分(降序)。谢天谢地,我找到了a really good solution to this

创建反二等分的代码如下:

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

1 个答案:

答案 0 :(得分:2)

我认为你正在插入你正在迭代的列表。例如:

a = [1]

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

这会让您进入一个循环,您可以将1插入a