1. ホーム
  2. python

[解決済み] Pythonです。リスト内検索

2022-03-24 09:31:58

質問

こんなことに遭遇しました。

item = someSortOfSelection()
if item in myList:
    doMySpecialFunction(item)

しかし、時々、すべての項目で動作しないことがあります。まるで、リスト(文字列のリストである場合)で認識されなかったかのように。

これは、リスト内の項目を見つける最も「パイソン的」な方法なのでしょうか。 if x in l: ?

解決方法は?

最初の質問ですが、そのコードは全く問題なく、次のような場合に動作するはずです。 item の中の要素の1つに等しい。 myList . を含まない文字列を探そうとするかもしれません。 まさに のいずれかと一致するか、あるいは不正確な浮動小数点数を使用している可能性があります。

2つ目の質問についてですが リスト内のものを見つけるには、実はいくつかの方法があります。

中に入っているかどうか確認する

これは、あなたが説明したユースケースです。何かがリストの中にあるかどうかをチェックする。ご存知のように、あなたは in 演算子を使うことができます。

3 in [1, 2, 3] # => True

コレクションをフィルタリングする

つまり、ある配列の中で、ある条件を満たすすべての要素を見つけることです。これにはリスト内包やジェネレータ式が使える。

matches = [x for x in lst if fulfills_some_condition(x)]
matches = (x for x in lst if x > 6)

後者は ジェネレータ これは一種の遅延リストと考えることができ、繰り返し実行したときにのみ作成されます。ちなみに、最初のものは次のものと全く同じです。

matches = filter(fulfills_some_condition, lst)

をPython 2で作成しました。ここでは、高階関数が機能していることがわかります。Python 3では filter はリストではなく、ジェネレータのようなオブジェクトを返します。

最初の出現箇所を探す

ある条件にマッチする最初のものだけが欲しい (しかしそれが何であるかはまだわからない) 場合は、for ループを使ってもかまいません (場合によっては else 節もありますが、これはあまり知られていません)。また

next(x for x in lst if ...)

で、最初にマッチしたものを返すか StopIteration を使用します。あるいは

next((x for x in lst if ...), [default value])

アイテムの位置を探す

また、リストについては index メソッドを使用すると便利です。 ここで というように、ある要素がリストの中に入っています。

[1,2,3].index(2) # => 1
[1,2,3].index(4) # => ValueError

ただし、重複している場合は注意が必要です。 .index は常に最も低いインデックスを返します:....

[1,2,3,2].index(2) # => 1

重複があり、すべてのインデックスが必要な場合は enumerate() の代わりに

[i for i,x in enumerate([1,2,3,2]) if x==2] # => [1, 3]