2012-03-23 98 views
15

我有2個列表,其中包含相同數量的字典。每個字典都有一個唯一的密鑰。第二個列表中第一個列表的每個字典都有一個匹配,即在另一個列表中存在具有唯一密鑰的字典。但這兩本字典的其他內容可能會有所不同。例如:比較由Python中的唯一鍵字典組成的2個列表

list_1 = [ 
      { 
       'unique_id': '001', 
       'key1': 'AAA', 
       'key2': 'BBB', 
       'key3': 'EEE' 
      }, 
      { 
       'unique_id': '002', 
       'key1': 'AAA', 
       'key2': 'CCC', 
       'key3': 'FFF' 
      } 
     ] 

list_2 = [ 
      { 
       'unique_id': '001', 
       'key1': 'AAA', 
       'key2': 'DDD', 
       'key3': 'EEE' 
      }, 
      { 
       'unique_id': '002', 
       'key1': 'AAA', 
       'key2': 'CCC', 
       'key3': 'FFF' 
      } 
     ] 

我想比較2匹配字典的所有元素。如果任何元素不相等,我想打印不等於元素。

請你幫忙,

感謝 問候

回答

21

假設類型的字典在您的示例輸入排隊一樣,你可以使用zip()函數來獲取相關的對類型的字典的列表,然後您可以使用any()檢查是否是有區別的:

>>> list_1 = [{'unique_id':'001', 'key1':'AAA', 'key2':'BBB', 'key3':'EEE'}, 
       {'unique_id':'002', 'key1':'AAA', 'key2':'CCC', 'key3':'FFF'}] 
>>> list_2 = [{'unique_id':'001', 'key1':'AAA', 'key2':'DDD', 'key3':'EEE'}, 
       {'unique_id':'002', 'key1':'AAA', 'key2':'CCC', 'key3':'FFF'}] 
>>> pairs = zip(list_1, list_2) 
>>> any(x != y for x, y in pairs) 
True 

或獲得的不同的對:

>>> [(x, y) for x, y in pairs if x != y] 
[({'key3': 'EEE', 'key2': 'BBB', 'key1': 'AAA', 'unique_id': '001'}, {'key3': 'EEE', 'key2': 'DDD', 'key1': 'AAA', 'unique_id': '001'})] 

您甚至可以不匹配每對密鑰:可能連同關聯的值

>>> [[k for k in x if x[k] != y[k]] for x, y in pairs if x != y] 
[['key2']] 

>>> [[(k, x[k], y[k]) for k in x if x[k] != y[k]] for x, y in pairs if x != y] 
[[('key2', 'BBB', 'DDD')]] 

注:如果你是輸入列表尚未排序,您也可以輕鬆完成:

>>> from operator import itemgetter 
>>> list_1, list_2 = [sorted(l, key=itemgetter('unique_id')) 
         for l in (list_1, list_2)] 
+0

@Lattyware:是的,我假設列表以匹配的字典在兩個列表中具有相同位置的方式對齊。在我看來,這是OP面臨的形勢。 – 2012-03-23 19:41:59

+0

@ NiklasB.無限期,但我想我會提到它的完整性。 – 2012-03-23 19:43:51

+0

@Niklas B .:是的,這些清單是排序的。但它可能不是。如果列表沒有排序,我該怎麼辦? – alwbtc 2012-03-23 19:44:13

1

下面比較了詞典和打印不相等的項:

for d1, d2 in zip(list_1, list_2): 
    for key, value in d1.items(): 
     if value != d2[key]: 
      print key, value, d2[key] 

輸出:key2 BBB DDD。通過使用zip,我們可以一次迭代兩個字典。然後,我們遍歷第一個字典的項目,並將該值與第二個字典中的相應值進行比較。如果這些不相等,那麼我們打印密鑰和兩個值。

+0

它如何知道它應該比較具有相同「unique_id」鍵的字典? – alwbtc 2012-03-23 19:46:26

+1

根據我假定的詞典列表已被定購。如果情況並非如此,那麼您需要首先使用'unique_id'命令。 – 2012-03-23 19:48:26

1

我實際上並不依賴於特定的密鑰的版本,這樣的元素是相等的(零)或他們不是(非壽):

list_1 = [{'unique_id':'001', 'key1':'AAA', 'key2':'BBB', 'key3':'EEE'}, {'unique_id':'002', 'key1':'AAA', 'key2':'CCC', 'key3':'FFF'}] 
list_2 = [{'unique_id':'001', 'key1':'AAA', 'key2':'DDD', 'key3':'EEE'}, {'unique_id':'002', 'key1':'AAA', 'key2':'CCC', 'key3':'FFF'}] 
list_3 = [{'Name': 'Abid', 'Age': 27},{'Name': 'Mahnaz', 'Age': 27}] 
list_4 = [{'Name': 'Abid', 'Age': 27},{'Name': 'Mahnaz', 'Age': 27}] 

print cmp(list_1,list_1) 
print cmp(list_1,list_3) 
print cmp(list_1,list_2) 
print cmp(list_2,list_1) 
print cmp(list_3,list_4) 

給出:

Return Value : 0 
Return Value : 1 
Return Value : -1 
Return Value : 1 
Return Value : 0 
+0

'''cmp()'''做什麼?你可以提供給我執行'''cmp()''' – 2017-12-14 18:40:40

+0

@ShubhamSrivastava:你可以從官方信息中讀取它「cmp(x,y) 比較兩個對象x和y並返回一個整數如果x y則返回嚴格正值。 https://docs.python.org/2/library/functions.html#cmp – alemol 2017-12-15 19:25:52

0
Let list1 = [] 
list2 = [] 

To fetch all the key values we can do like this: 
key_values = list1[0] 
key = key_values.keys() //key is a list and contains all key values 

below is a piece of code which compares all the key pair values: 

for val in list1: 
    first_key = key[0] 
    for val2 in list2: 
     if val2[first_key] == val[first_key]: 
      for val3 in key: 
       if val2[val3] != val[val3]: 
        Unmatched.append(val) 

print unmatched 

Above contains matches dictionary and prints for which all key, pair values didn't match. 
0
def new_change(old_list, new_list): 
    change_list = [] 
    for x in new_list: 
     for y in old_list: 
      if x['unique_id'] != y['unique_id']: 
       change_list.append(x) 
    return change_list 

通新老名單中此方法的側