使用不同的键

时间:2017-08-30 10:39:58

标签: python python-3.x

目标

我试图同时迭代两个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键传递),但是:

  1. 不会迭代dict本身,只需生成数字以尝试匹配给定的dict
  2. 迭代值,即使它们在dict中都不存在,i in di1 or i in di2False)。
  3. 仅当键是数字时才有效。
  4. 似乎不是非常pythonic。
  5. 停止

    如果密钥至少存在于其中一个中,我如何迭代两个(或更多)dict个(密钥)?

    条件

    1. 优选使用标准库的解决方案。
    2. 您可以假设dict个键是数字的,但更优选的是更通用的解决方案。
    3. 迭代顺序并不重要,但有关此事的其他信息是奖励。
    4. 我正在迭代两个dict s。
    5. 两个dict都应保持不变。
    6. 我正在使用python 3.6.1

4 个答案:

答案 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)

如上所述,如果重复键的值相同,则可以正常使用。如果存在变化,将返回第一个链接字典的值。