62

リストが 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 行にまとめて整理する方法はありますか?

4

6 に答える 6

77

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

;)

于 2012-05-19T19:40:14.707 に答える
70

簡単なワンライナーは次のようになります。

any(i in b for i in a)
于 2012-05-19T19:39:30.760 に答える
63

これを行うには多くの方法があります。最も直接的な翻訳は次のとおりです。

any_in = lambda a, b: any(i in b for i in a)

次のようなセットに関連するさまざまなものを使用することもできます。

any_in = lambda a, b: bool(set(a).intersection(b))

(これは、ハッシュ可能であるという要素に依存しaますが、それが本当である場合、これらのアプローチのいずれかから、より大きなセットを作成する方がおそらく高速です) ab

編集:以下のさまざまな人々が指摘しているように、Python 2.6以降isdisjointよりも優れています。intersectionそれについて学べてうれしいです。:)

于 2012-05-19T19:39:23.443 に答える
17

これは集合の問題であり、リストの問題ではありません。適切なデータ型があれば、多くの場合、答えはすぐにわかります:-)

def func(a, b):
    return not set(a).isdisjoint(b)
于 2012-05-19T19:43:46.540 に答える
6

リストをセットに変換することで、それらに対してセット操作を実行できます。交差が 0 より大きい場合、一致する要素が少なくとも 1 つあります。

len(set(a) & set(b)) > 0
于 2012-05-19T19:39:40.360 に答える
5

これはうまくいくはずです。

def func(a, b):
    return any([i in b for i in a])
于 2012-05-19T19:40:04.783 に答える