如何在遍历列表的同时遍历字典的键,并更改字典

3
  1. 我有一个列表l。
  2. 我有一个字典d。

我想遍历列表l。对于任何列表项,我想遍历d.keys。

如果满足某些条件,我想要“更新”我的字典。

我尝试嵌套两个for循环并放入if语句——但是不能更改正在迭代的对象的长度。

d = {'this': '1', 'is': '2', 'a': '3', 'list': '4'}

l = ['A', 'B', 'C', 'D', 'E']

for word in l:
    for key in d.keys():
        if len(key) < 2:#some condition
            d.pop(key)
        else:
            print(word, key)

这是我得到的输出:
A this
A is
Traceback (most recent call last):
  File "untitled3.py", line 6, in <module>
    for key in d.keys():
RuntimeError: dictionary changed size during iteration

我认为应该采用的方法是建立一个新的字典,其中包含不满足该条件的键。 - user8408080
2个回答

4

你可以使用循环遍历副本 d

d = {'this': '1', 'is': '2', 'a': '3', 'list': '4'}

l = ['A', 'B', 'C', 'D', 'E']

for word in l:
    for key in d.copy().keys(): # Notice the change
        if len(key) < 2:#some condition
            d.pop(key)
        else:
            print(word, key)

1
完整复制字典 len(l) 次可能有点昂贵。另外,要迭代字典的键,只需使用 for key in d.copy():,无需访问 keys() - jpp

2

在迭代字典的视图时,不应更改字典的大小。相反,您可以构造一个新字典,然后打印任何您喜欢的内容。例如:

d = {'this': '1', 'is': '2', 'a': '3', 'list': '4'}
L = ['A', 'B', 'C', 'D', 'E']

d_new = {k: v for k, v in d.items() if len(k) >= 2}

for word in L:
    for key in d_new:
        print(word, key)

文档所述:

dict.keys()dict.values()dict.items()返回的对象是视图对象。它们提供了字典条目的动态视图,这意味着当字典发生更改时,视图会反映这些更改....在添加或删除字典条目时迭代视图可能会引发RuntimeError或无法迭代所有条目。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接