Python:控制流程

时间:2014-09-19 19:01:48

标签: python control-flow

我现有代码的问题。代码:

example_dic = {'name': 'jim','value': 4}
list_of_dic = [example_dic,dic2,dic3,...]
empty_list = []    #will be filled with multiple dictionaries all in same format/same keys
key_sum = sum(blah['value'] for blah in empty_list)    #tested this with a filled in "list_of_dic", works as expected

if not empty_list or key_sum < arbitrary_value:
    for things in list_of_dic[:]:
        if case1:
            empty_list.append(things)
            list_of_dic.remove(things)
        elif case2:
            empty_list.append(things)
            list_of_dic.remove(things)
        else:
            pass

问题是key_sum即使事件被附加到empty_list,也不会得到更新。正如我在评论中所说的那样,我知道key_sum行是有效的,因为我通过首先用随机的东西填写字典列表来尝试它。

我想要的是,只有在list_of_dic时才会将项目添加到key_sum < arbitrary。例如,如果我想要key_sum < 20,如果下一个项目导致key_sum >= 20,我根本不希望它被添加,而不是简单地在已经添加之后中断和结束。我也不希望代码在那里结束,如果有一个包含10个项目的列表且第一个项目有value = 22我不希望整个事情停止,我希望它继续通过休息,添加项目,直到它无法添加,不会导致key_sum >= 20

更简单的答案是,还有其他任何语言不需要这种不必要的复杂功能吗?

1 个答案:

答案 0 :(得分:2)

这有几个问题。一个是您的代码假设key_sum在您更改empty_list时自动更新,但事实并非如此。它只计算一次。您需要在每次迭代时重新计算key_sum,或者如果您真的担心效率,请在每次追加到key_sum时增加empty_list。您似乎还想在for循环的每次迭代中检查key_sum的值,而不是仅在您对整个list_of_dic进行迭代之后。

第二个问题是,您在迭代它时会从list_of_dic中删除项目。这在Python中具有未定义的行为,并且通常会导致跳过某些迭代元素。相反,您需要迭代列表的副本。

总结变化:

for things in list_of_dic[:]:  # Iterate over a copy of list_of_dic
    do_append = False
    if case1:
        do_append = True
    elif case2:
        do_append = True

    if do_append:
        if (key_sum + things['value']) >= arbitrary_value:
            continue
        empty_list.append(things)
        list_of_dic.remove(things)
        key_sum += things['value']