リストが
a=[1,2,3]
あり、その中の数字の少なくとも 1 つが別のリストに存在する
b=[4,5,6,7,8,1]
かどうかを知りたいとしましょうb
。私は今、次のようなことができます
def func(a, b):
for i in a:
if i in b:
return True
return False
しかし、それを 1 行にまとめて整理する方法はありますか?
リストが
a=[1,2,3]
あり、その中の数字の少なくとも 1 つが別のリストに存在する
b=[4,5,6,7,8,1]
かどうかを知りたいとしましょうb
。私は今、次のようなことができます
def func(a, b):
for i in a:
if i in b:
return True
return False
しかし、それを 1 行にまとめて整理する方法はありますか?
Python 2.6 以降:
def func(a, b):
return not set(a).isdisjoint(b)
2.4 または 2.5 の場合:
def func(a, b):
return len(set(a).intersection(b)) != 0
2.3 以下の場合:
sudo apt-get update
sudo apt-get upgrade
;)
簡単なワンライナーは次のようになります。
any(i in b for i in a)
これを行うには多くの方法があります。最も直接的な翻訳は次のとおりです。
any_in = lambda a, b: any(i in b for i in a)
次のようなセットに関連するさまざまなものを使用することもできます。
any_in = lambda a, b: bool(set(a).intersection(b))
(これは、ハッシュ可能であるという要素に依存しa
ますが、それが本当である場合、これらのアプローチのいずれかから、より大きなセットを作成する方がおそらく高速です) a
。b
編集:以下のさまざまな人々が指摘しているように、Python 2.6以降isdisjoint
よりも優れています。intersection
それについて学べてうれしいです。:)
これは集合の問題であり、リストの問題ではありません。適切なデータ型があれば、多くの場合、答えはすぐにわかります:-)
def func(a, b):
return not set(a).isdisjoint(b)
リストをセットに変換することで、それらに対してセット操作を実行できます。交差が 0 より大きい場合、一致する要素が少なくとも 1 つあります。
len(set(a) & set(b)) > 0
これはうまくいくはずです。
def func(a, b):
return any([i in b for i in a])