1

想象一个函数:

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)) ...

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

4

3 回答 3

9

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

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

如果您多次检查这些列表中的成员资格(即在许多xs 上),您将希望在开始循环遍历s之前将每个成员设置为一个集合。x

从您最近的编辑来看,您似乎还希望能够在x. 代码是:

def inAll(xs, *lsts):
    return all(all(x in l for x in xs) for l in lsts)
于 2012-11-02T18:40:21.020 回答
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
于 2012-11-02T18:51:10.173 回答
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

最好事先将列表转换为集合,但是在函数内部插入转换conde很容易(但如果您有很多这些控件,请保留集合的副本)

于 2012-11-02T21:19:12.873 回答