我现有代码的问题。代码:
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
。
更简单的答案是,还有其他任何语言不需要这种不必要的复杂功能吗?
答案 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']