0

重複の可能性:
条件に一致するリストの最初のアイテムを返します

リスト内包表記を使用して「一致する」リスト要素を簡単に取得するにはどうすればよいですか?たとえばlist、私は特定の文字列で始まる要素を探しています。それは簡単です:

>>> lines = ['AHP Buildlife number', 'NIT-Version-Default-v0.16.0', 'E_release v2.3.14.0']
>>> [ x.strip() for x in lines if x.startswith('NIT-Version-Default') ]
['NIT-Version-Default-v0.16.0']

ifしかし、一致するlist-elementをさらに処理するために使用できるように、ステートメント内から同じことを行うにはどうすればよいですか。このようなもの:

>>> if [ x.strip() for x in lines if x.startswith('NSS-Checkin-Default') ]:
...   ver = x.split('-')[-1].strip()
...   print ver

v0.16.0そのため、バージョン番号として返されます。これは明らかに機能しませんが、うまくいけば、私が何をしようとしているのかがわかります。それを行う方法はありますか?乾杯!!

PS。質問やタイトルを改善することを歓迎します。

4

4 に答える 4

2

要素を 1 つだけ探している場合:

x = next(x.strip() for x in lines if x.startswith('NSS-Checkin-Default'))
ver = x.split('-')[-1].strip()

(a for b in c if d)リスト内包表記ではなく、ジェネレータ式を使用したことに注意してください[a for b in c if d]。このように、反復はlines実際に必要な間だけ行われます (この場合、最初の要素が見つかるまで)。

要素が見つからない場合は、nextが発生しStopIterationます。


さらに、要素が 1 つ (または固定 N の場合は正確に N 要素) であることを確認したい場合は、次のように記述できます (タプルに割り当てます)。

(x,) = (x.strip() for x in lines if x.startswith('NSS-Checkin-Default')

その場合ValueError、ジェネレーター式が生成する要素が少なすぎるか多すぎる場合があります。これを「タプルアンパッキング」と呼びます。

以下も参照してください。

条件に一致するイテラブルから最初のアイテムを取得する最良の方法は何ですか?

于 2013-01-18T17:35:52.543 に答える
0

マップ機能を参照してください。代わりに、理解の重要な必要性はわかりません。

map(lambda x: x.split('-')[-1].strip(),
        filter(lambda x: x.startswith('NIT'), lines)) 
于 2013-01-18T17:44:26.710 に答える
0

シンプル: リスト内包表記は 1 つの要素を含むリストを返すので、その要素にアクセスするだけです。thelist[0]

あなたの例から取るには:

lines = ['AHP Buildlife number', 'NIT-Version-Default-v0.16.0', 'E_release v2.3.14.0']
results = [ x.strip() for x in lines if x.startswith('NIT-Version-Default') ]
ver = results[0].split('-')[-1].strip()
print ver
于 2013-01-18T17:32:54.317 に答える
0
>>> for each in lines:
...     match=re.search("(^NIT-Version-Default).*(v[0-9.]+)",each)
...     if match:
...             print match.group(2)
... 
v0.16.0
于 2013-01-18T17:40:22.517 に答える