2015-03-19 40 views
3

我有两个字典。他们共享一些钥匙。我想迭代这些共享密钥。这里有三种方法来做到这一点。在两个字典中遍历共享密钥

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,我发现使代码更难以遵循。

是否有我应该使用的标准?这是三个之一吗?

回答

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+

然而,不要担心!此功能被向后移植到Python 2.7,但以不同的名称(以免破坏现有的代码),dict.viewkeys()

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

(同输出)

带套 - 2.3+

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

小号& 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

的Python 2具有['dict.viewkeys()'](https://docs.python.org/2/library/stdtypes.html#dict.viewkeys)。使用'set()'也是多余的。如果你需要使用'set()',那么直接*在字典上,所以'set(x)&set(y)',不需要创建额外的列表/字典视图对象。 – 2015-03-19 08:38:08

+0

@MartijnPieters这是一个很好的关于2.7的backports和键,我会相应地更新。 – jedwards 2015-03-19 08:39:33

1

如果你想避免压痕(不过,说真的,它看起来并不像很多),并希望比第一个更清晰的东西,你可以使用一个交集:

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

&是相交的操作,确保您遍历只共享密钥。如果你想遍历所有的键,使用x.keys()| y.keys()

+0

啊!当然,我再次错过了蟒蛇2和3的区别。使用python3的另一个好理由。 – vermillon 2015-03-19 07:36:07