目标
我试图同时迭代两个dict
,知道它们有一些共同的键(肯定),但其中一些不是(可能)。更多相同的键可以(很少但仍然)以不同的方式排序。另一个问题是dict
可以有不同的长度。在我的例子中,键都是数字键。
尝试解决方案
示例dict
s:
di1 = {1: "a", 2: "b", 3: "c", 5:"e"}
di2 = {1: "a", 2: "b", 4: "d", 5:"e", 6:"f"}
在阅读了迭代多个dict
的一些答案后,我尝试了zip()
两个dict
s:
for i, j in zip( di1, di2 ): print( i, j )
1 1
2 2
3 4
5 5
但这会“削减”较长的dict
,这也会分别迭代每个dict
的键,而不是保持一致(始终为i == j
,即使i in di1 and j in di2
会返回False
)
鉴于在我的情况下所有键都是数字键,我尝试了以下内容:
for i in range(max(max(di1), max(di2))+1): print(i)
0
1
2
3
4
5
6
有效(我可以将i
作为dict
键传递),但是:
dict
本身,只需生成数字以尝试匹配给定的dict
。dict
中都不存在,i in di1 or i in di2
为False
)。停止
如果密钥至少存在于其中一个中,我如何迭代两个(或更多)dict
个(密钥)?
条件
dict
个键是数字的,但更优选的是更通用的解决方案。dict
s。dict
都应保持不变。答案 0 :(得分:4)
您可以迭代常用键:
for key in di1.keys() & di2.keys():
print(key)
或者密钥联合:
for key in di1.keys() | di2.keys():
print(key)
你选择。在Python 2中使用dict.viewkeys()
。
答案 1 :(得分:1)
我将从两个dicts(.keys()
)中提取密钥,加入密钥列表,删除重复项(使其成为set
),然后使用这组新密钥迭代dicts。 / p>
keys1 = di1.keys()
keys2 = di2.keys()
keys = keys1 + keys2
keys = set(keys)
for key in keys:
try:
di1[key]
di2[key]
except KeyNotFoundError:
# key is not present in both dicts
pass
答案 2 :(得分:0)
您可以使用itertools.izip_longest
来迭代直到较长的集合,其中zip
迭代直到较小的集合。
>>> di1 = {1: "a", 2: "b", 3: "c", 5:"e"}
>>> di2 = {1: "a", 2: "b", 4: "d", 5:"e", 6:"f"}
>>>
>>> from itertools import izip_longest
>>> for a, b in izip_longest(di1, di2):
... print(di1.get(a), di2.get(b))
...
('a', 'a')
('b', 'b')
('c', 'd')
('e', 'e')
(None, 'f')
这里要看的是使用dict.get(key)
,因为使用dict[key]
将导致KeyError用于唯一键。但是,您可以在dict.get(key, default_value)
内添加可选的默认值作为第二个参数。
希望这有帮助。
答案 3 :(得分:0)
假设值在各种词典之间保持一致,您可以使用collections.ChainMap
迭代多个词典:
from collections import ChainMap
di1 = {1: "a", 2: "b", 3: "c", 5:"e"}
di2 = {1: "a", 2: "b", 4: "d", 5:"e", 6:"f"}
chained_dicts = ChainMap(di1, di2) # add more dicts as required
for key in chained_dicts:
print(key, chained_dicts[key])
输出:
1 a 2 b 3 c 4 d 5 e 6 f
或更简单:
for key, value in ChainMap(di1, di2).items():
print(key, value)
如上所述,如果重复键的值相同,则可以正常使用。如果存在变化,将返回第一个链接字典的值。