2016-07-13 2 views
3

readlines()によってダンプされた文字列のリストが得られました。部分文字列または最後の行を含む最初の行のインデックスを探したいと思います。文字列のリストで部分文字列を検索すると、返されるインデックス

これは動作しますが、不格好なようです:

fooIndex=listOfStrings.index((next((x for x in listOfStrings if "foo" in x),listOfStrings[-1]))) 

が二回検索するより良い方法がなければならないが、私はそれを見つけることができません。 - ちょうど反復可能としてそれを使用するあなたが行を反復するためにファイルオブジェクトに.readlines()を呼び出す必要はありません

def get_index(strings, substr): 
    for idx, string in enumerate(strings): 
     if substr in string: 
      break 
    return idx 

注:両方、より読みやすく、効率的になり機能でenumerate()を使用して

+1

ていますか?最も効率的な方法は、ファイルの内容を直接ループすることです(** readlineを呼び出さないでください)。そして、あなたが望むテキストでその行が見えるときに停止/戻ります。 –

+0

各行のインデックスを取得するために反復処理を行う場合は、 'enumerate'を使用できます。 – jonrsharpe

+0

私はデータブロックをスライスしているので、インデックス付きスライスサブリストを 'numpy.genfromtxt'を含む関数に渡す方が効率的だと思います。データブロック(私は尋ねるべきだと思う別の質問)。 –

答えて

3

私はこのための良い(すなわち可読)ワンライン解決策はないと思います。 @ eugeneのループの代わりにtry/exceptを使用することもできます。

def get_index(list_of_strings, substring): 
    try: 
     return next(i for i, e in enumerate(list_of_strings) if substring in e) 
    except StopIteration: 
     return len(list_of_strings) - 1 

コードは少し長いですが、意図は非常に明確である私見:部分文字列を含む次のインデックス、またはリストの長さマイナス1を取得してください。


更新:実際には、そこあるワンライナー(まあ、多少大丈夫っぽい)良い、とあなたはほとんどnextdefaultパラメータを使用して、それを持っていたが、代わりに最後の要素を使用しての自身デフォルト、その後indexを呼び出すように、単にインデックス自体を入れて、enumerateと組み合わせる:あなたは、インデックスを必要とすることを確認

next((i for i, e in enumerate(list_of_strings) if substring in e), 
    len(list_of_strings) - 1) 
+0

2番目のものは多かれ少なかれ私が探していたものですが、インデックスを使ってリストをスライスするので、 'len(list_of_strings)'は必要ありません。 '-1':
' next((iの場合はi、eの場合はeを​​列挙すれば(list_of_strings)、 - 1) ' –

+1

@DanielForsmanはい、スライスするために(そしてほとんどすべての他の目的のために) 。しかし、[...: - 1]にスライスすると、最後の要素が除外されることに注意してください。あなたがそれを望むかどうか分からない。 –

+0

いいえ、私はしません!ありがとう。 –

2

関連する問題