代码之家  ›  专栏  ›  技术社区  ›  Helen Neely

循环浏览2个词典列表

  •  0
  • Helen Neely  · 技术社区  · 5 年前

    我有这两本字典,我想把所有的 名称 来自于 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 因为清单2中没有b。不知道我做错了什么……任何帮助都会被感激的。

    谢谢

    4 回复  |  直到 5 年前
        1
  •  1
  •   Prune    5 年前

    这显然不是代码的逻辑。您迭代所有名称组合,并从 list1 每一个 时间不匹配 list2

    相反,在知道它与 全部的 这些名字:

    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
  •   Austin    5 年前

    在没有找到匹配项的每种情况下,都要重复并打印。

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

    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
  •  1
  •   Devesh Kumar Singh    5 年前

    当前在您的双for循环中打印 item['name'] 对于 any list1和list2的两个元素,这不是您想要的。

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

    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'}
    
        4
  •  0
  •   Alain T.    5 年前

    如果列表1中的名称是唯一的,则可以使用集合:

    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'}
    

    如果它们不是唯一的,并且您希望匹配实例的数量,则可以使用集合中的计数器执行此操作:

    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,则如果列表1中有两个名为“a”的条目,则输出将为[“a”,“b”],因为列表1中只有一个“a”会在列表2中找到匹配项。