2015-03-19 39 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