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

任意の数のリスト (3 つだけでなく) を指定できるようにしたい場合は、次のようにします。

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

これらのリストのメンバーシップを何度も (つまり、多くの で) チェックしている場合は、 のループを開始する前xに、それぞれをセット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 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

事前にリストをセットに変換することをお勧めしますが、関数内に変換条件を挿入するのは簡単です(ただし、これらのコントロールが多数ある場合は、セットのコピーを保持してください)

于 2012-11-02T21:19:12.873 に答える
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 に答える