迭代两个词典中的共享键

时间:2015-03-19 07:16:14

标签: python

我有两个词。他们分享一些钥匙。我想迭代这些共享密钥。这有三种方法。

x={1:'a', 2:'b', 3:'c'}
y={2:'beta', 3:'gamma', 4:'delta'}

for n in (key for key in x if key in y):
    print n

for n in x:
    if n in y:
        print n

for n in x:
    if n not in y:
        continue
    print n

第一个看起来将来很难阅读。

第二个会在循环中有很多缩进。

第三个使用continue我发现使代码更难以遵循。

我应该使用什么标准?它是这三个中的一个吗?

2 个答案:

答案 0 :(得分:5)

最佳方法取决于您使用的Python版本。它们都涉及使用&运算符进行集合交集。

  • 3.0 + dict.keys()方法
  • 2.7 + dict.viewkeys()方法
  • 2.3 + set方法

dict.keys() - 3.0 +

在Python 3中,dict.keys()返回一个dict_keys对象,该对象覆盖&运算符[1]:

x={1:'a', 2:'b', 3:'c'}
y={2:'beta', 3:'gamma', 4:'delta'}

for k in x.keys() & y.keys():
    print(k, x[k], y[k])

输出:

2 b beta
3 c gamma

但在Python 2中,这将为您提供TypeError

Traceback (most recent call last):
    for k in x.keys() & y.keys():
TypeError: unsupported operand type(s) for &: 'list' and 'list'

dict.viewkeys() - 2.7 +

但是,不要烦恼!这个功能在2.7中被反向移植到Python,但是使用不同的名称(以免破坏现有代码),dict.viewkeys()

for k in x.viewkeys() & y.viewkeys():
    print k, x[k], y[k]

(相同输出)

有套装 - 2.3 +

从2.3开始,您就可以使用sets和交叉(&)运算符。

  

s& t:具有s和t共同元素的新集合

例如:

for k in set(x) & set(y):
    print k, x[k], y[k]

(相同输出)

但是,在这里,您要复制密钥占用的空间(一次在字典中,作为密钥,再一次在一个完全独立的set中)

[1] PEP-3106 Revamping dict.keys(), .values() and .items()

答案 1 :(得分:1)

如果你想避免缩进(虽然,实际上,它看起来并不多)并且想要比第一个更清晰的东西,你可以使用一个集合交叉点:

for k in x.keys() & y.keys():
    print k

&安培;是交集运算符,确保仅迭代共享密钥。如果要迭代所有键,请使用x.keys()| y.keys()