Pythonのリストに何かがあるかどうかを確認するにはどうすればよいですか?
最も安価で読みやすいソリューションは、in
演算子(または特定のケースではnot in
)を使用することです。ドキュメントで述べたように、
演算子in
とnot in
メンバーシップをテストします。がのメンバーであるかどうかをx in s
評価し、それ以外のTrue
場合x
は評価し
ます。の否定を返します。s
False
x not in s
x 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問題:set
s を検討しましたか?
次の質問を自問してください。
- アイテムがリストに複数回あるかどうかを確認する必要がありますか?
- このチェックはループ内で行われますか、それとも関数が繰り返し呼び出されますか?
- リストに保存しているアイテムはハッシュ可能ですか?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つではないことに注意してください。