如何检查元素是否也在另一个列表中

时间:2012-11-02 18:38:51

标签: python list tuples

想象一个功能:

def Intersects (x, list1, list2, list3):
    if x in list1 and x in list2 and x in list3: return True
    return False

必须有更好的方法来做到这一点,但我无法弄清楚。我怎样才能做到这一点? (表现很重要)

编辑:这次我遇到了一个相关但更难的问题。这次我有3个不相关的整数,我需要测试它们是否相交。

像:

1, 2, 3 <-- elements to look for
if InAll ((1, 2, 3)) ...

但我不是在寻找元组,而是在寻找整数。如何解压元组并进行相同的搜索?

3 个答案:

答案 0 :(得分:9)

如果您希望能够为其提供任意数量的列表(不只是三个),您可能会喜欢:

def inAll(x, *lsts):
    return all((x in l) for l in lsts)

如果您多次检查这些列表中的成员资格(在许多x上),那么在开始遍历{{1}之前,您需要将每个成员列入set。 }}第

从您最近的编辑中,您似乎也希望能够在x中传递多个项目。代码是:

x

答案 1 :(得分:0)

 def intersects(x,L1,L2,L3):
     if not isinstance(x,(list,tuple)):
            x = [x]
     return set(x).intersection(L1).intersection(L2).intersection(L3) == set(x)

应该适用于很多东西

>>> l1 = range(10)
>>> l2 = range(5,10)
>>> l3 = range(2,7)
>>> def intersects(x,L1,L2,L3):
...      if not isinstance(x,(list,tuple)):
...             x = [x]
...      return set(x).intersection(L1).intersection(L2).intersection(L3) == set(x)
...
>>> intersects(6,l1,l2,l3)
True
>>> intersects((5,6),l1,l2,l3)
True
>>> intersects((5,6,7),l1,l2,l3)
False

答案 2 :(得分:0)

做这样的事情的最好方法是使用集合...可能即使转换时间也会更有效:

def InAll(element_list, *sets):
    #calculate the intersection between all the sets
    intersection = reduce( lambda i , j: i & j, sets )
    #check if every element is in the intersection
   return all( i in intersection for i in element_list )


sets = [ set(range(5)), set(range(10)) ]
InAll( [9], *sets )
#False

sets = [ set(range(5)), set(range(10)) ]
InAll( [1,3], *sets )
#True

最好事先将列表转换为set,但是很容易在函数中插入转换conde(但如果你有很多这些控件,请保留一组副本)