我有这两个字典列表,我试图从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。不确定我在做什么错...任何帮助将不胜感激。
谢谢
答案 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中的匹配项