2017-08-30 52 views
-2

迭代多個字典使用不同的密鑰

我試圖在同一時間進行迭代2個dict小號知道他們有一些關鍵的共同點(肯定的),但他們中的一些不(可能是我們的目標)。更多相同的鍵可以(很少,但仍然)以不同的順序排列。另一個問題是,dict可以有不同的長度。在我的情況下,鍵都是數字。

Atempted解決方案

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的按鍵seperately,而不是讓他們保持一致(總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 

其中工程(我可以通過idict關鍵),但:

  1. 不重複dict每人S SE,只是生成號碼嘗試匹配給定dict s。
  2. 即使在dict s(i in di1 or i in di2False)中都不存在密鑰,它們也會對值進行迭代。
  3. 這隻有在鍵是數字時纔有效。
  4. 似乎不太pythonic。

的quesstion

如何迭代因爲它是足夠的關鍵,其中至少有一個存在兩個(或更多)dict S(鑰匙)?

條件下,使用標準庫

  1. 解是優選的。
  2. 您可以假設dict鍵是數字,但更通用的解決方案是可取的。
  3. 迭代次序並不重要,但有關此事的其他信息是獎金。
  4. 我正在迭代兩個dict s。
  5. dict s應保持不變。
  6. 我正在使用python 3.6。1
+0

如果每個字典中重複鍵的_value_值不同,該怎麼辦? – mhawke

回答

4

可以遍歷普通鑰匙:

for key in di1.keys() & di2.keys(): 
    print(key) 

鍵或聯合:

for key in di1.keys() | di2.keys(): 
    print(key) 

您選擇。在Python 2中使用dict.viewkeys()

1

我會提取兩種類型的字典(.keys())鍵,加入了按鍵的列表,刪除重複項(使其set),然後遍歷使用該組新的密鑰的類型的字典。

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 
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)內添加一個可選的默認值作爲第二個參數。

希望這會有所幫助。

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) 

A如上所述,如果重複鍵的值相同,則這很好。哪裏有變化,第一個鏈接字典的值將被返回。