Python:控制流

Python:控制流,python,control-flow,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) #test

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

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
example_dic={'name':'jim','value':4}
dic列表=[示例dic,dic2,dic3,…]
空的_列表=[]。#将填充多个字典,所有字典的格式/键都相同
key_sum=sum(blah['value']表示空列表中的blah)#使用填写的“列表_of _dic”对此进行测试,结果与预期一致
如果不是空列表或键总和<任意值:
对于dic[:]列表中的内容:
如果情况1:
空列表。追加(内容)
移除(物品)的列表
elif案例2:
空列表。追加(内容)
移除(物品)的列表
其他:
通过
问题是,
key\u sum
即使在
empty\u列表
中添加了内容,也不会得到更新。正如我在评论中所说,我知道
key\u sum
行是有效的,因为我先用随机的东西填充字典列表

我想要的是,只有当
key\u sum
时,项目才会不断添加到dic的
列表中。例如,如果我想要
key\u sum<20
,如果下一项导致
key\u sum>=20
,我根本不希望添加它,而不是简单地在已经添加之后中断并结束。我也不希望代码在这里结束,如果有一个包含10个项目的列表,而第一个项目的值为22,我不希望整个过程停止,我希望它继续进行,继续添加项目,直到它无法再添加,而不会导致
key\u sum>=20


更简单的答案是,有没有其他语言不需要为看似非常简单的任务带来如此不必要的复杂性?

这有几个问题。一个是,您的代码假设当您更改
空列表时,
键和
会自动更新,但事实并非如此。只计算一次。您需要在每次迭代时重新计算
key\u sum
,或者如果您真的担心效率,请在每次附加到
空列表时增加
key\u sum
。您似乎还希望在for循环的每次迭代中检查
键的值,而不是仅在迭代了整个
dic列表之后

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

总结这些变化:

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']

这些不是静态声明,而是按顺序执行的操作。因此,写入变量的值将保留在那里,直到显式更改为止。它不是key_sum的定义,它包含空列表中所有值字段的列表。说实话,我对你说的几乎一无所知。“那些”指的是什么?为什么我希望任何东西都是静态的,我希望‘key_sum’不是静态的?通过简单地将“if not empty_list…”语句切换为“for things in list_of…”,“key_sum”确实会更新,但整个循环无法遵守“key_sum”<任意值语句。对不起,让我尝试更好地解释。关键是许多人首先学习数学,其中一些连接语句的顺序并不重要。如果您前后切换
x=1
y=x
,则不会发生任何变化,并且
y
始终等于
1
等于
x
。然而,程序是自上而下执行的,这些不是方程,而是赋值,因此顺序很重要。因此,尽管Python和math共享部分相似的语法,但其背后的含义不同。您的建议解决了删除问题,因此,谢谢您,但它没有解决“key_sum”问题。它仍然远远超过我设置的任意值。递增如何工作?我不需要在什么地方再次申报“key_sum”吗?@awar我想我明白你现在在找什么了。我更新了我的答案。啊,是的,这似乎更符合我的要求。我会尝试一下,但在我尝试之前,如果最后一个if语句('get_sum(d)='而不是'@awar是的,我已经修复了第一个输入错误。我将大小检查放在循环的末尾,因为当您最初输入for循环时,您的
键和
将永远不会高于
任意值
。这只是一个小优化,在我们知道可能已经在
空\u列表中添加了一个条目之后,只检查我们是否在上面。而且,看起来您永远不会期望在dic的列表上迭代一次以上,对吗?在这种情况下,您不需要在
for
循环之外使用
if
语句。如果我想迭代多次,就不使用它了?这仍然不起作用,它似乎只有在添加了导致sum>=武断的字典后才会中断,如果超过了,我如何告诉它根本不添加它?