2013-09-26 22 views
-2

比較Python字典,我有兩個大蟒蛇字典在下面的表格,我想對它們進行比較,並在相同指數報告他們的錯配,爲相同的密鑰。字典具有相同的密鑰,但元組的長度不相等。在相同指數

d1 = {'a':(1,2,3,4,66,6,6,64), 'b':(3,2,5,3,2,1,1,1)} 
d2 = {'a':(1,2,4,3,66,6,6,64), 'b':(1,8,5,3,2,1,22,9)} 

例如,對於關鍵'a',索引2和3的不同值。 由於字典很大,元組的長度不一定相等,所以我的業餘循環方法不起作用。

for k1,v1 in dict1: 
    for k2, v2 in dict2: 
     if k1 == k2: 
      for i in range(len(v1)): 
       for j in range(len(v2)): 
        if i==j: 
        if v1[i] != v2[j]: 
         print k1, v1[i] 
         print k2, v2[i] 
+6

什麼是您預期的輸出? – TerryA

+1

字典值是具有非唯一,無序值的元組。你是否希望找到兩個詞典中都有鍵的項目之間的區別?您如何期望比較起作用?除非元組的值和順序相同,否則它應該返回false嗎?或者如果所有值都存在但是順序不同?現在的情況如何,但發生次數有多少? – Spaceghost

+0

這兩個詞典具有相同的鍵,但值是具有未知和不等長度的元組。我希望得到的輸出是打印字典具有不同值的位置,對於相同的鍵和相同的索引。 – Rob

回答

1

這裏是一個開始:

for k in d1: 
    if k not in d2: 
     continue 
    v1, v2 = d1[k], d2[k] 
    for i in xrange(min(len(v1), len(v2))): 
     if v1[i] != v2[i]: 
      print k, i, v1[i] 
      print k, i, v2[i] 

,打印:

a 0 1 
a 0 2 
a 1 2 
a 1 33 
a 2 3 
a 2 4 
a 3 4 
a 3 5 
b 0 3 
b 0 1 
b 1 2 
b 1 8 
b 2 2 
b 2 5 
b 3 1 
b 3 3 

螺母知道這是你想要的。如果字典沒有相同的密鑰怎麼辦?那麼長度不同的元組呢?等圖全部出來,你可以調整上述做你想做的;-)

+0

是的,輸出正是我想要的。我只需要解決元組問題的不等長度。 – Rob

1

假設你想要處理在這兩個字典中找到的所有鍵,無論字典迭代器返回的順序如何做到這一點:

d1k = set(d1.keys()) 
for d in d1k.intersection(d2.keys()): 
    # handle tuple comparison 

如果你要處理的元組進行比較,而不考慮訂購或複製事遂所願:

if len d1[d] < d2[d]: 
    for v in d1[d]: 
     if v not in d2[d]: 
      print d, v 
else: 
    for v in d2[d]: 
     if v not in d1[d]: 
      print d, v 
+0

在Python3中,'keys()'已經返回一個集合的視圖對象。在Python 2.7中,使用'viewkeys()' – iruvar

+0

使用viewkeys不會返回一個名爲intersection的方法的對象。我可以改爲d1.viewkeys()和d2.viewkeys()..沒有太多的好處,我已經 – Spaceghost

+0

那麼它確實爲您節省創建一個新的集合的成本。可能對小型詞典來說無關緊要,但是在那裏用於拍攝和使用大型詞典時,它應該會產生顯着差異 – iruvar