web-dev-qa-db-ja.com

Python 'in'演算子を使用してリストを確認する方法/タプルに整数0、1、2のそれぞれが含まれている

Python in演算子を使用してリスト/タプルsltnに整数0、1、2が含まれていることを確認するにはどうすればよいですか?

私は以下を試しました、なぜ両方が間違っているのですか?

# Approach 1
if ("0","1","2") in sltn:
     kwd1 = True

# Approach 2
if any(item in sltn for item in ("0", "1", "2")):
     kwd1 = True

更新:なぜ変換しなければならなかったのか("0", "1", "2")のいずれかのタプルに(1, 2, 3)?またはリスト[1, 2, 3]

6
G.Armstrong
if ("0","1","2") in sltn

sltnリストにタプル("0","1","2")が含まれているかどうかを確認しようとしていますが、そうではありません。 (3つの整数が含まれています)

しかし、 #all() を使用してそれを完了することができます:

sltn = [1, 2, 3] # list
tab = ("1", "2", "3") # Tuple

print(all(int(el) in sltn for el in tab)) # True
8

inキーワードを使用すると、オブジェクトの__contains__メソッドを呼び出すことができます。

>>> a = [1, 2, 3]
>>> 2 in a
True
>>> a.__contains__(2)
True

したがって、("0","1","2") in [0, 1, 2]は、タプル("0", "1", "2")がリスト[0, 1, 2]containedであるかどうかを尋ねます。この質問に対する答えはFalseです。 Trueになるには、次のようなリストが必要です。

>>> a = [1, 2, 3, ("0","1","2")]
>>> ("0","1","2") in a
True

タプルの要素は文字列であることにも注意してください。タプルの要素の一部またはすべてがこれらの要素を整数に変換した後-がリストに含まれているかどうかを確認する必要があります。

タプルのすべての要素が(整数として)リストに含まれているかどうかを確認するには、次を使用します。

>>> sltn = [1, 2, 3]
>>> t = ("0", "2", "3")
>>> set(map(int, t)).issubset(sltn)
False

タプルの要素(整数として)がリストに含まれているかどうかを確認するには、次を使用できます。

>>> sltn_set = set(sltn)
>>> any(int(x) in sltn_set for x in t)
True

そしてanyが実行する遅延評価を利用します。

もちろん、特別な理由がないのでタプルに文字列が含まれている場合は、
(1, 2, 3)およびintへの変換を省略します。

22
timgeb

シーケンスにチェックする要素のallが含まれているかどうかを確認するには、allの呼び出しでジェネレーター内包表記を使用できます。

if all(item in sltn for item in ("0", "1", "2")):
    ...

どちらかがリスト内にある場合は、代わりにanyを使用できます。

if any(item in sltn for item in ("0", "1", "2")):
    ...
1
L3viathan

ここで広く提案されているように、時間を無駄にしたくない、リスト内のすべてのデータを反復処理したくない場合は、次のようにします。

_a = ['1', '2', '3']
b = ['4', '3', '5']

test = set(a) & set(b)
if test:
    print('Found it. Here it is: ', test)
_

もちろん、if set(a) & set(b)を実行できます。私はデモンストレーションの目的でそれをしませんでした。 _&_をandに置き換えないでください。これらは2つの実質的に異なるオペレーターです。

上記のコードは次のように表示されます。

_Found it. Here it is:  {'3'}
_
0
Pouria