Pythonのリストに何かがあるかどうかを確認するにはどうすればよいですか?
最も安価で読みやすいソリューションは、in演算子(または特定のケースではnot in)を使用することです。ドキュメントで述べたように、
演算子inとnot inメンバーシップをテストします。がのメンバーであるかどうかをx in s評価し、それ以外のTrue場合xは評価し
ます。の否定を返します。sFalsex not in sx in s
さらに、
演算子not inは、の逆の真の値を持つように定義されていますin。
y not in x論理的にはと同じnot y in xです。
以下にいくつかの例を示します。
'a' in [1, 2, 3]
# False
'c' in ['a', 'b', 'c']
# True
'a' not in [1, 2, 3]
# True
'c' not in ['a', 'b', 'c']
# False
タプルはハッシュ可能であるため(タプルも不変であるという事実の結果として)、これはタプルでも機能します。
(1, 2) in [(3, 4), (1, 2)]
# True
ドキュメントの比較セクションの最後の段落で説明されているように、RHS上のオブジェクトが__contains__()メソッドを定義している場合は、inそれを内部的に呼び出します。
... inとはnot in、反復可能な型または__contains__()メソッドを実装する型でサポートされています
。たとえば、次のことを行うことができます(すべきではありません)。
[3, 2, 1].__contains__(1)
# True
inショートサーキットなので、要素がリストの先頭にある場合は、inより速く評価されます:
lst = list(range(10001))
%timeit 1 in lst
%timeit 10000 in lst # Expected to take longer time.
68.9 ns ± 0.613 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
178 µs ± 5.01 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
アイテムがリストにあるかどうかを確認するだけではない場合は、オプションがあります。
list.indexアイテムのインデックスを取得するために使用できます。その要素が存在しない場合、a ValueErrorが発生します。
list.count 出現回数を数えたい場合に使用できます。
XY問題:sets を検討しましたか?
次の質問を自問してください。
- アイテムがリストに複数回あるかどうかを確認する必要がありますか?
- このチェックはループ内で行われますか、それとも関数が繰り返し呼び出されますか?
- リストに保存しているアイテムはハッシュ可能ですか?IOW、あなた
hashは彼らを呼ぶことができますか?
これらの質問に「はい」と答えた場合は、set代わりにを使用する必要があります。s のinメンバーシップテストlistはO(n)時間の複雑さです。これは、pythonがリストの線形スキャンを実行し、各要素にアクセスして検索項目と比較する必要があることを意味します。これを繰り返し行う場合、またはリストが大きい場合は、この操作によってオーバーヘッドが発生します。
set一方、オブジェクトは、一定時間のメンバーシップチェックのために値をハッシュします。チェックも使用して行われinます:
1 in {1, 2, 3}
# True
'a' not in {'a', 'b', 'c'}
# False
(1, 2) in {('a', 'c'), (1, 2)}
# True
残念ながら、検索している/検索していない要素がリストの最後にある場合、Pythonはリストを最後までスキャンします。これは、以下のタイミングから明らかです。
l = list(range(100001))
s = set(l)
%timeit 100000 in l
%timeit 100000 in s
2.58 ms ± 58.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
101 ns ± 9.53 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
注意として、これは、格納および検索している要素がハッシュ可能である限り、適切なオプションです。IOW、それらは不変の型か、を実装するオブジェクトでなければなりません__hash__。
3 -1 > 0 and (4-1 , 5) not in []⤇Trueしたがって、エラーは演算子の優先順位の1つではないことに注意してください。