Pythonに問題があります。
簡単なリストを作成します。
>>> my_list = ["one","two","three"]
文字列を検索するための「単一行コード」を作成します。
たとえば、私はこのコードを持っています:
>>> [(i) for i in my_list if i=="two"]
['two']
しかし、変数が間違っているのを見ると(リストの最後の値が見つかりました):
>>> print i
three
変数に最後の要素が含まれていて、検索したい要素が含まれていないのはなぜですか?
リスト内包表記を使用して、フィルタリングされたリストを作成しています。 i
は引き続きそのリストのすべての要素にバインドされ、最後の要素は引き続き生成されるリストから除外された場合でも_'three'
_です。
リスト内包表記を使用して1つの要素を選択しないでください。 for
ループを使用し、break
ループを終了するだけです。
_for elem in my_list:
if elem == 'two':
break
_
mustが必要な場合(Pythonの哲学に反する、可読性が重要な場合) )、 next()
function およびジェネレーター式を使用します。
_i = next((elem for elem in my_list if elem == 'two'), None)
_
そのような一致する要素がない場合、i
をNone
に設定します。
上記はフィルターとしては有用ではありません。あなたは本質的に値_'two'
_がリストにあるかどうかをテストしています。そのためにin
を使用できます:
_elem = 'two' if 'two' in my_list else None
_
実行するとき
>>> [(i) for i in my_list if i=="two"]
i
はリストで繰り返されますmy_list
。リストの内包表記の評価が終了すると、i
が繰り返しの最後のアイテムに割り当てられます。つまり、"three"
。
リスト内包表記では、ループ変数iはグローバルになります。 forループでの反復後、リストの最後の要素への参照になります。
すべての一致が必要な場合は、リストを変数に割り当てます。
filtered = [ i for i in my_list if i=='two']
最初の一致のみが必要な場合は、関数ジェネレーターを使用できます
try:
m = next( i for i in my_list if i=='two' )
except StopIteration:
m = None