[英]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
问题是即使将事情追加到empty_list
, key_sum
也不会更新。 正如我在评论中说的那样,我知道key_sum
行是有效的,因为我通过先填充随机内容的字典列表来进行尝试。
我想要的是,仅当key_sum < arbitrary
,项才会继续添加到list_of_dic
。 例如,如果我想要key_sum < 20
,如果下一项导致key_sum >= 20
,那么我根本就不希望添加它,而不仅仅是在添加完之后就中断并结束。 我也不希望代码到此结束,如果有一个包含10个项目的列表,而第一个具有value = 22
我不想整个事情都停下来,我希望它继续进行其余的工作,添加项目直到它不再添加不会导致key_sum >= 20
。
比较简单的答案是,是否有其他语言不需要看起来很简单的任务就不需要这种不必要的复杂性?
这有两个问题。 一种是您的代码假定在您更改empty_list
时key_sum
会自动更新,但事实并非如此。 它只计算一次。 你需要重新计算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']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.