2012-03-23 30 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 

通新老名单中此方法的侧