2010-11-03 116 views
0

詞典列表我有兩個字典比較兩個在Python

{key1:[list_of_objects ], {key2:[list_of_objects ]} 

e.g

dict1 = {key1:['a', 'b', 'c', 'd' ], key2: ['f', 'g', 'h' ] } 
dict2 = {key1:['a', 'b', 'c', 'd'], key2: ['f', 'g', 'h', 'i' ] } 

對於這兩個dict1和dict2 EACK關鍵,我想比較列表中的項目。

即將dict1 [key1]中的每個值與dict2 [key1]中的相應值進行比較等等。列表中的項目是對象,因此將運行類似於

if dict1[key1][0].some_function() = = dict2[key1][0].some_function() 
    then condition 

運行此比較的最快方法是什麼?

+2

你有一個工作的方式做到這一點?一旦你這樣做了,現在是時候擔心速度了。 – SilentGhost 2010-11-03 15:10:56

+0

你想在dict2 [key2]中用'i'做什麼?它在dict1中沒有對應的值。 – 2010-11-03 15:58:05

+0

不確定你想要做什麼。 我假設你有一個MyClass類,它有一個成員函數some_function,它計算一個可以通過==比較的數字(或其他可比較的數字)。 現在,你是否想對每一場比賽做點什麼而不關心列表中的順序?如果dict1 ['key1'] = [A,B,C]和dict2 ['key1'] = [B,C,A]是否應該找到任何匹配? (大概沒有,因爲列表不排隊)。你需要列表鍵中的所有對象在做某事之前匹配嗎?你想遍歷所有的鍵或只是比較key1? – 2010-11-03 16:11:54

回答

0
for key in dict1.keys(): 
    for a,b in zip(dict1[key],dict2[key]): 
     if a.some_function() == b.some_function(): 
      #do something 

如果你的清單很長,你可以從collectionsizip交換zip

+0

這實際上是假設列表中的條目有序並且長度相等。 – json 2010-11-03 16:15:40

+0

@json如果他們長度不一樣,你沒有什麼可比較的。還是你計劃在物品不同時採取行動,而不是隻是當它們是相同的時候? – 2010-11-03 17:14:27

+0

比較,類似的項目,並記錄那些不在任何一個列表中 - 但上面的工作對我來說,我只是添加了一個檢查,以確保列表是相同的長度。 – json 2010-11-04 08:49:14

0

套可以很容易:

for key in dict1.keys(): 
    diff = set(dict1[key]).symmetric_difference(dict2[key]) 
    if diff: 
     print "%s: %s" % (key, diff) # or do whatever 
+0

這裏有兩個問題。這不包括運行'some_function'方法。 2.當物品相同時,OP想要做些什麼,而不是當物品不同時。 – 2010-11-03 16:14:26

+0

好點。我想我被OP對這個問題的原始解釋以及在這個例子中使用字符串所困惑。 – ianmclaury 2010-11-03 21:48:33

+0

由於OP稍後澄清了順序很重要,我不打算更新這個基於集合的解決方案。 – ianmclaury 2010-11-03 21:54:09