2017-04-20 101 views
2

不確定爲什麼我不能弄清楚這一點,但我希望程序查看2個字典,如果密鑰匹配,我希望它打印密鑰隨着來自像這樣兩個字典的值..檢查兩個不同字典中的相同密鑰,打印密鑰和兩個值

[結果]

a 1 2 
b 2 4 
c 3 6 
d 4 8 

[CODE]

from collections import Counter 

a = Counter({'a':1,'b':2,'c':3,'d':4}) 
b = Counter({'a':2,'b':4,'c':6,'d':8}) 

for key in b.most_common(): 
    if set(a.keys()) == set(b.keys()): 
     print(key) 

回答

4

您可以通過這兩個按鍵的set intersection迭代:

>>> set(a.keys()) & set(b.keys()) 
set(['a', 'c', 'b', 'd']) 

下面是與類型的字典是不完全類似的例子:

from collections import Counter 

a = Counter({'a':1,'b':2,'c':3,'d':4,'e':5}) 
b = Counter({'a':2,'b':4,'c':6,'d':8,'f':7}) 

common_keys = set(a.keys()) & set(b.keys()) 

for key in common_keys: 
    print("%s %d %d" % (key, a[key], b[key])) 
# a 1 2 
# c 3 6 
# b 2 4 
# d 4 8 

請注意,轉換到set不preverse的Counter順序。

你可以轉換setlist,並根據這兩個值的總和進行排序:

a = {'a':1,'b':2,'c':3,'d':4,'e':5} 
b = {'a':2,'b':4,'c':6,'d':8,'f':7} 

common_keys = list(set(a.keys()) & set(b.keys())) 

common_keys.sort(key=lambda k: a[k] + b[k], reverse=True) 

for key in common_keys: 
    print("%s %d %d" % (key, a[key], b[key])) 
# d 4 8 
# c 3 6 
# b 2 4 
# a 1 2 

最後,如果你不關心根據其值之和排序的關鍵,這裏是你的代碼稍加修改的版本:

from collections import Counter 

a = Counter({'a':1,'b':2,'c':3,'d':4}) 
b = Counter({'a':2,'b':4,'c':6,'d':8}) 

for key, a_value in a.most_common(): 
    if key in b: 
     print("%s %d %d" % (key, a_value, b[key])) 
+0

是不是將一個集合轉換爲一個列表,然後對它進行一些過度設計?我認爲在這種情況下簡單地遍歷'most_common'中的鍵然後進行成員測試是很容易的,因此您只需要一次傳遞。 –

+0

@ juanpa.arrivillaga:是的。我仍然想保留most_common功能。感謝評論,我更新了代碼,但後來認識到它基本上是你已經寫的。 –

+0

嗯,我不是荷蘭人或類似的東西,但我想應該只有一個明顯的方法來做到這一點;) –

0
common_keys = sorted(set(a.keys()).intersection(b.keys())) 

for key in common_keys: 
    print(key, a[key], b[key]) 
+0

請確保您解釋以及 –

0

你幾乎在那裏,你if條件是關閉,most_common返回元組列表,所以你需要解壓的鍵值對

>>> a = Counter({'a':1,'b':2,'c':3,'d':4}) 
>>> b = Counter({'a':2,'b':4,'c':6,'d':8}) 
>>> for key, bval in b.most_common(): 
...  if key in a: 
...   print(key, a[key], bval) 
... 
d 4 8 
c 3 6 
b 2 4 
a 1 2 
>>> 

如果你不關心順序,(即你不需要撥打most_common),你可以迭代交叉點。在Python 3,這是很簡單的:

>>> a.keys() & b.keys() 
{'d', 'a', 'c', 'b'} 
>>> 

因爲.keys實際上返回更像一組比列表的視圖。

>>> for common_key in a.keys() & b.keys(): 
...  print(common_key, a[common_key], b[common_key]) 
... 
d 4 8 
a 1 2 
c 3 6 
b 2 4 
>>> 
+0

這很好用!當我將它合併到我的代碼中時,但是我得到一個錯誤ValueError:解壓縮的值太多(預期爲2):/ – k5man001

+0

@ rogernm001 uhhh您看到終端會話的輸出,所以我不確定究竟是什麼造成的那個錯誤。我猜這是來自'關鍵,Bval ...'線? –

+0

是的那條線..我的字典中的實際數據就像這樣a = {('192.168.10.2',7),('192.168.10.5',11)...} AND b = {('192.168.10.2 ',65596),('192.168.10.5,95943 ...)} ...這可能是原因嗎? – k5man001

相關問題