【问题标题】:Iterating over the values of a python dict and simultaneous update迭代python dict的值并同时更新
【发布时间】:2014-05-11 07:38:17
【问题描述】:

我想知道如何迭代值并同时更新 python 的字典。为什么下面的代码不起作用?

for values in First_Dict.values():
    if True:
        Second_Dict= Function(values)
        First_Dict.update(Second_Dict)

有一个解决方案,但不是很优雅。它包括一个列表和 iter()。显然,我不在乎钥匙。

tempList = [i for i in First_Dict.values()]
iterator = iter(tempList)
while True:  
    try:   
        TempIterator = iterator.next()  
    except StopIteration:
        break  
        if True:
            Second_Dict= Function(values)
            for j in Second_Dict.values():  
                tempList.append(j)

【问题讨论】:

  • 您能发布一个示例输入和预期输出吗?不清楚你到底在问什么。
  • 您能解释一下您要做什么吗? Second_Dict 是什么?使用相同的参数在同一个字典上多次调用 update 不会产生任何额外的效果。另外,为什么你有if True
  • @Bill 输入是一个字典,如果条件为真,输出将是更大的字典。
  • @BrenBam:如果值的某些条件为真,我正在尝试随时更新字典。更新将使用另一本词典。内容的类型对于逻辑的工作来说并不重要。
  • @BrenBarn:如果条件为 True,则 Second_Dict 是主体中函数的输出,因此每次更新都不相同。实际上,对于 First_Dict 的每个值,Second_Dict 都会不同(或 0 大小)。

标签: python dictionary


【解决方案1】:

你把事情复杂化了;只需在dict.values() 上使用list() 即可创建副本并避免出现RuntimeError: dictionary changed size during iteration 异常:

for value in list(First_Dict.values()):
    if True:
        First_Dict.update(Second_Dict)

如果需要动态增长的列表,先存储列表,再循环:

values = list(First_dict.values())
for value in values:
    if True:
        values.extend(Second_Dict.values())

这当然不会更新原来的字典,只是扩展values列表。

这假设您使用的是 Python 3;在 Python 2 中,dict.values() 已经返回列表副本,而不是字典视图;你可以直接使用values = First_dict.values()

【讨论】:

  • 正如之前有人在这里提到的那样 - 不要在驾驶时更换车轮。 ;)
  • @kroolik:在这种情况下,目的地是什么是完全清楚的,更不用说车辆了,或者实际上,如果 OP 正在开车。 :-)
  • 非常感谢Martijn。第二种解决方案肯定比我的更优雅。有趣的是,您的第一个解决方案不起作用(给出与我的问题相同的输出)。我想,因为即使 First_Dict 更新,使用 list(First_Dict.values()) 创建的列表也不会更新。顺便说一句,在我原来的问题中,我没有得到 RunTimeError。 Python 是 2.7.5+。
  • 如何强制使用字典视图,而不是值列表?
  • @Ivaylo:使用dict.viewvalues()。但是,您不能在迭代时更改字典。