bugfix> python > 投稿

私の質問は、私が現在取り組んでいる問題の結果です。私がする必要があるのは、そのようなものを使用することです:

if myString in list[][1]:
   do something

...そのような構造上:

[
[object1Name, string_1, string_2],
[object2Name, string_1, string_2],
[object3Name, string_1, string_2],
[object4Name, string_1, string_2]
]

最上位リストアイテムのいずれかでmyStringがstring_1と等しいかどうかを確認し、(後で)条件を満たす最上位リストアイテムのインデックスも取得する必要があります。

トップレベルのリスト内のすべての要素を循環させるために、ifステートメントを含む追加のforループを使用して実装できることを認識していますが、それを避けたくありません。できれば「in」を使用したワンライナーが必要ですが、それが不可能な場合は他に何かが必要です。

リストの代わりに辞書に対してもまったく同じことをする必要があります(これとほぼ同じソリューションを使用することを望みます)。

回答 1 件
  • any(..) を使用する必要があります  ここ:

    if any(myString == sublist[1] for sublist in lst):
        # ... do something
        pass
    
    

    ディクショナリの反復可能オブジェクトの場合、キーは次のように整数ではない可能性があることを除いて、まったく同じです:

    if any(myString == subdict[some_key] for subdict in lst):
        # ... do something
        pass
    
    

    ここで、 sublist を繰り返します。 s in lst 。いずれかの sublist の場合 s、 myString == sublist[1] 、これは成功し、そうでなければ失敗します。

    したがって、ここではジェネレータを使用します。ザ・ any(..)   True であるアイテムを見つけた瞬間から停止します 。ただし、これは線形時間で実行されます(最悪の場合)。

    編集:最初のインデックスは次で取得できます:

    idx = next((idx for idx, sublist in enumerate(lst) if myString == sublist[1]), None)
    
    

    これは None を返します  そのようなインデックスが存在しない場合。

    またはリスト内包表記ですべてのインデックスを取得できます:

    idcs = [idx for idx, sublist in enumerate(lst) if myString == sublist[1]]
    
    

あなたの答え