3

文字列のリストがあります-次のようなものです

mytext = ['This is some text','this is yet more text','This is text that contains the substring foobar123','yet more text']

foob​​ar で始まるものの最初の出現を見つけたいです。grep を実行している場合は、foobar* を検索します。私の現在のソリューションは次のようになります

for i in mytext:
    index = i.find("foobar")
    if(index!=-1):
        print i

これはうまく機能しますが、これを行うための「より良い」(つまり、よりPythonicな)方法があるかどうか疑問に思っていますか?

乾杯、マイク

4

5 に答える 5

15

リスト内包表記を使用することもできます:

matches = [s for s in mytext if 'foobar' in s]

(そして、THC4k が気づいたように「foobar」で始まる文字列を本当に探していた場合は、次のことを考慮してください。

matches = [s for s in mytext if s.startswith('foobar')]
于 2009-08-11T15:15:33.690 に答える
9

foob​​ar で始まる文字列の最初の出現が本当に必要な場合 (これは、コードとは大きく異なりますが、すべての回答が提供され、grep についての言及 - どのように矛盾することができますか?-) を試してください:

found = next((s for s in mylist if s.startswith('foobar')), '')

foundこれは、条件に一致する mylist の項目がない場合、結果として空の文字列を返します。単純な genexp の代わりに itertools などを使用することもできますが、重要なトリックはnext、デフォルトでビルトインを使用するこの方法です (Python 2.6 以降のみ)。

于 2009-08-11T15:39:34.203 に答える
6
for s in lst:
    if 'foobar' in s:
         print(s)
于 2009-08-11T15:06:50.430 に答える
5
results = [ s for s in lst if 'foobar' in s]
print(results)
于 2009-08-11T15:15:18.697 に答える
4

本当に foobar で始まる文字列を探している場合( foobarではありません ):

for s in mylist:
  if s.startswith( 'foobar' ):
     print s

また

found = [ s for s in mylist if s.startswith('foobar') ]
于 2009-08-11T15:15:51.270 に答える