迭代两个词典中的共享键

Joe*_*oel 3 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
Run Code Online (Sandbox Code Playgroud)

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

第二个将在循环中有很多缩进.

第三种用途continue,我发现使代码更难以遵循.

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

jed*_*rds 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])
Run Code Online (Sandbox Code Playgroud)

输出:

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]
Run Code Online (Sandbox Code Playgroud)

(输出相同)

套装 - 2.3+

从2.3你可以使用sets,和交叉(&)运算符.

s&t:包含s和t共有元素的新集合

例如:

for k in set(x) & set(y):
    print k, x[k], y[k]
Run Code Online (Sandbox Code Playgroud)

(输出相同)

但是,在这里,你复制了键占用的空间(一次在字典中,作为键,再一次完全分开set)

[1] PEP-3106改造dict.keys(),. value()和.items()