含まれる値に基づいてタプルのコレクションからタプルを取得

StackOverflow https://stackoverflow.com/questions/1047403

  •  20-08-2019
  •  | 
  •  

質問

私はこのようなタプルの集合であるデータ構造を持っています:

things = ( (123, 1, "Floogle"), (154, 33, "Blurgle"), (156, 55, "Blarg") )

第一及び第三の要素は、各コレクションに固有である。

私は何をしたい例えば、3番目の値を参照することにより、特定のタプルを取得されます:

>>> my_thing = things.get( value(3) == "Blurgle" )
(154, 33, "Blurgle")

1でそれぞれの値1を確認するためにループを書くよりも良い方法があるに違いありません!

役に立ちましたか?

解決

thingsがリストである、とあなたは第三の要素がuniqeであることがわかっている場合は、どのようなリストの内包についてはどうですか?

>> my_thing = [x for x in things if x[2]=="Blurgle"][0]

フードの下が、私はそれがすべての値を通過し、それらを個別にチェックすると仮定します。あなたはそれが気に入らない場合、どのようなことがmy_thingsだようdict構造を変更し、キーとして第1又は第3の値のいずれかを使用してはどうですか?

他のヒント

あなたが示すようあなたの外側のレベルの構造は、タプルの場合は、

ループ(またはリスト内包またはgenexpのようなものを100%に相当)は本当に唯一の方法である - タプルは、意図的な設計により、非常に軽量ですコンテナ、実際にはほとんどのいずれかの方法で。(ちょうどいくつかの特別なインデックスを実装するために必要な方法で、ループなど; - )

超高速検索が辞書ではなく、タプルの特徴です。あなたは(多分、またはメインタプルのインデックス)(主な構造として、または側補助として1)の辞書を持っているあなたが求めるsubtupleへのマッピング「第三要素の値が」できませんか?あなたが持っている気にしてそれは、単一のループで構築された後、など多くの高速な検索を実現することができます!

これまでの私の回答が(それは半分だけループがそうであるように)の両方より読みやすいとlistcompよりも平均多分倍の速度であるブライアンさんのコメントのとおり、あなたは、ループにgenexpを選択した場合:

my_thing = next(item for item in things if item[2] == "Blurgle")

あなたが最初から開始しているあなたが見つける「次」の項目は、「最初」になるように(「もの[2]サブ項目Blurgle equaleの次の項目」としてスムーズに読み込む - であり、あなたの場合、唯一の - 。適切なもの)

あなたは何の項目が述語を満たしていないの場合をカバーするために必要がある場合は、

は、あなたが「あなた(私のスニペットのように、無二番目の引数で)そうでない場合、第二引数を(必要であればそれが返される)next渡すことができます(あなたはケースが発生することはありません言うように問題の発生が予期しないエラーになるため、例外は、特定のアプリケーションに適して見えます)のいずれかの行動は、あなたが望むものかもしれ - 何のアイテムが述語を満たしていない場合を呼び出すとStopIteration例外を取得するでしょうます。

あなたが検索のこのタイプを複数回行う必要がある場合、あなたは物事が1時間をthings_dictに変換しない理由、後に

で検索するように簡単かつ高速になります
things = ( (123, 1, "Floogle"), (154, 33, "Blurgle"), (156, 55, "Blarg") )

things_dict = {}
for t in things:
    things_dict[t[2]] = t

print things_dict['Blarg']
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top