遍历2个词典列表

时间:2019-05-31 18:08:18

标签: python dictionary

我有这两个字典列表,我试图从list1中打印出所有名称,如果在list2中找不到它们。

list1=[{'name':'A','color':'1'},
       {'name':'B','color':'2'}]

list2=[{'name':'A','color':'3'},
       {'name':'C','color':'1'}]

for item in list1:
    for ii in list2:
        if item['name'] != ii['name']: 
            print item['name']

我得到的输出是

A
B
B

我希望它能打印B,因为list2中没有b。不确定我在做什么错...任何帮助将不胜感激。

谢谢

4 个答案:

答案 0 :(得分:1)

当前在double for循环中,您在item['name']的list1和list2两个元素之间打印不匹配any,这不是您想要的。

相反,您可以将两个列表中的名称都转换为一个集合,并采用集合差异

list1=[{'name':'A','color':'1'},
       {'name':'B','color':'2'}]

list2=[{'name':'A','color':'3'},
       {'name':'C','color':'1'}]

#Iterate through both lists and convert the names to a set in both lists
set1 = {item['name'] for item in list1}
set2 = {item['name'] for item in list2}

#Take the set difference to find items in list1 not in list2
output = set1 - set2
print(output)

输出将为

{'B'}

答案 1 :(得分:1)

(显然)这不是代码的逻辑。您遍历所有名称组合,然后从list1 一次打印与list2中的任何名称都不匹配的名称。

相反,除非您知道这些名称的 all 不匹配,否则不要打印它:

for item in list1:
    found = False
    for ii in list2:
        if item['name'] == ii['name']:  
            found = True

    if not found:
        print item['name']

这是对您的实现的直接更改。有一行可以使用理解力,all和其他Python功能来做到这一点。

答案 2 :(得分:1)

在没有找到匹配项的所有情况下,您都要进行遍历并打印。

您可以改为在更有效的集合中使用查找:

for x in list1:
    if x['name'] not in {y['name'] for y in list2}:
        print(x['name'])

使用all(),您可以执行以下操作:

for x in list1:
    if all(x['name'] != y['name'] for y in list2):
        print(x['name'])

答案 3 :(得分:0)

如果名称在list1中是唯一的,则可以使用一组:

list1=[{'name':'A','color':'1'},
       {'name':'B','color':'2'}]

list2=[{'name':'A','color':'3'},
       {'name':'C','color':'1'}]

set1         = set(d['name'] for d in list1) 
missingNames = set1.difference(d['name'] for d in list2) # {'B'}

如果它们不是唯一的,并且您想匹配实例数,则可以使用集合中的Counter来实现:

from collections import Counter
count1 = Counter(d['name'] for d in list1) 
count2 = Counter(d['name'] for d in list2)
missingNames = list((count1-count2).elements()) # ['B']

对于Counter,如果您在list1中有两个名称为'A'的条目,那么输出将为['A','B'],因为list1中只有两个'A'可以找到list2中的匹配项