web-dev-qa-db-ja.com

Python for and if on line

Pythonに問題があります。

簡単なリストを作成します。

>>> my_list = ["one","two","three"]

文字列を検索するための「単一行コード」を作成します。

たとえば、私はこのコードを持っています:

>>> [(i) for i in my_list if i=="two"]
['two']

しかし、変数が間違っているのを見ると(リストの最後の値が見つかりました):

>>> print i
three

変数に最後の要素が含まれていて、検索したい要素が含まれていないのはなぜですか?

13
rostonik

リスト内包表記を使用して、フィルタリングされたリストを作成しています。 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)
_

そのような一致する要素がない場合、iNoneに設定します。

上記はフィルターとしては有用ではありません。あなたは本質的に値_'two'_がリストにあるかどうかをテストしています。そのためにinを使用できます:

_elem = 'two' if 'two' in my_list else None
_
18
Martijn Pieters

実行するとき

>>> [(i) for i in my_list if i=="two"]

iはリストで繰り返されますmy_list。リストの内包表記の評価が終了すると、iが繰り返しの最後のアイテムに割り当てられます。つまり、"three"

14
Cong Ma

リスト内包表記では、ループ変数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
6
desiato