【问题标题】:Can I check if a list contains any item from another list? [duplicate]我可以检查一个列表是否包含另一个列表中的任何项目吗? [复制]
【发布时间】:2020-05-31 11:48:10
【问题描述】:

使用 Python,我想检查一个列表是否包含另一个列表中也存在的项目/值。例如,这是我想要做的:

list1 = ['item1','item2','item3']
list2 = ['item4','item5','item3']

if list1 contains any items also in list2:
    print("Duplicates found.")
else:
    print("No duplicates found.")

如您所见,list2 包含一个在 list1 中也存在的项目,即“item3”。有什么方法可以检测到是否发生这种情况?

谢谢。

【问题讨论】:

标签: python list set-intersection


【解决方案1】:

any() 与生成器表达式一起使用:

list1 = ['item1','item2','item3']
list2 = ['item4','item5','item3']

if any(x in list1 for x in list2):
    print("Duplicates found.")
else:
    print("No duplicates found.")

【讨论】:

    【解决方案2】:

    您可以使用setisdisjoint 是一个方法,如果两个集合没有共同点,则返回 True,如果集合重叠,则返回 False。将list1list2 转换为集合后,它们都包含'item3',因此isdisjoint 返回False

    set(list1).isdisjoint(set(list2))
    
    >>> list1 = ['item1','item2','item3']
    >>> list2 = ['item4','item5','item3']
    >>> set(list1).isdisjoint(set(list2))
    False
    

    您可以将其与 not 运算符结合使用来做您想做的事情。

    list1 = ['item1','item2','item3']
    list2 = ['item4','item5','item3']
    
    if not set(list1).isdisjoint(set(list2)):
        print("Duplicates found.")
    else:
        print("No duplicates found.")
    

    【讨论】:

      【解决方案3】:

      尝试使用集合:

      关注https://stackoverflow.com/a/2541823/1021819

      i=set.intersection(set(list1),set(list2))
      if len(i) > 0:
          print('duplicates found')
      else:
          print('no duplicates found')
      

      【讨论】:

      • 提供的示例包含语法错误。
      【解决方案4】:
      list1.extend(list2)
      if len(set(list1)) != len(list1) + len(list2):
          print("Duplicates Found")
      else:
          print("Duplicates Not Found")
      

      时间分析

      >>>def fun():
             list1 = [1,2,3,4]
             list2 = [3,4,2,1]
             if len(set(list1.extend(list2)) != len(list1) + len(list2):
                 return "Duplicates Found"
             else:
                 return "Duplicates Not Found"
      >>>%timeit fun()
      >>>3.59 µs ± 213 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
      >>>def fun1():
             list1 = [1,2,3,4]
             list2 = [3,4,2,1]
      
             if any(x in list1 for x in list2):
                 return "Duplicates Found"
             else:
                 return "Duplicates Not Found"
      >>>%%timeit fun1():
      >>>3.93 µs ± 696 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
      

      结论

      这两种方法花费的时间几乎相同,但“set + extend”方法的执行时间略短。

      【讨论】:

      • 这太贵了。
      • 你的fun 不会工作,因为list.extend 返回None
      • 是的..实际上这是一个新列表,两个列表合并在一起。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 2012-08-01
      • 1970-01-01
      相关资源
      最近更新 更多