如何在单个for循环中遍历两个字典?

10

我想生成以下效果:

for i, j in d.items() and k, v in c.items():
    print i, j, k, v

这是错误的。我想知道如何实现这个?

2个回答

19
for (i, j), (k, v) in zip(d.items(), c.items()):
   print i, j, k, v

请记住,除非您的字典是OrderedDict,否则顺序将是任意的。为了内存效率,在Python 2.x中(其中dict.itemszip创建列表),您可以执行以下操作:

from itertools import izip
for (i, j), (k, v) in izip(d.iteritems(), c.iteritems()):
   print i, j, k, v

对于小型列表,迭代这些中间列表可能会更快,但不一定快。当迭代非常大的数据结构时,您将会注意到速度的提升。

在Python3.x中,zipizip(已不存在)相同,并且dict.itemsdict.iteritems不再存在)返回一个视图,而不是一个列表


2
你的问题并不清楚,你是想在两个嵌套的for循环中迭代字典,还是像@jamylak的答案中所做的那样并排迭代字典。
以下是嵌套解释:
from itertools import product
for (i, j), (k, v) in product(d.items(), c.items()):
    print i, j, k, v

例子

>>> d={'a':'Apple', 'b':'Ball'}
>>> c={'1':'One', '2':'Two'}
>>> from itertools import product
>>> for (i, j), (k, v) in product(d.items(), c.items()):
...     print i, j, k, v
... 
a Apple 1 One
a Apple 2 Two
b Ball 1 One
b Ball 2 Two

可能值得提一下问题不清楚的原因 - 特别是,product 的结果类似于在两个嵌套的for循环中迭代字典,而jamylak的答案使用zip则类似于两个相邻的for循环。 - lvc

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