4

Python では、次のような辞書のリストがあります。

matchings = [
    {'id': 'someid1', 'domain': 'somedomain1.com'},
    {'id': 'someid2', 'domain': 'somedomain2.com'},
    {'id': 'someid3', 'domain': 'somedomain3.com'}
]

そして、変数があります:

the_id = 'someid3'

アイテムのドメイン値を取得する最も効率的な方法は何ですか?

4

5 に答える 5

6

リスト内包表記を使用できます:

domains = [matching['domain'] for matching in matchings if matching['id'] == the_id]

次の形式の標準形式に従います。

resulting_list = [item_to_return for item in items if condition]

基本的に、次のすべての機能をカプセル化します。

domains = []
for matching in matchings:
    if matching['id'] == the_id:
        domains.append(matching['domain'])

すべての機能は、リスト内包表記を使用して 1 行で表されます。

于 2009-01-16T19:47:57.093 に答える
2

再構築しmatchingsます。

from collections import defaultdict
matchings_ix= defaultdict(list)
for m in matchings:
    matchings_ix[m['id']].append( m )

現在、最も効率的なルックアップは

matchings_ix[ d ]
于 2009-01-16T20:16:04.353 に答える
1

私が理解できる最善の方法は、明示的な検索を行うことです。これは私が Python でがっかりした分野の 1 つで、C++ STL アルゴリズムのように分離されたビルディング ブロックの強力なセットが得られないことです。

[d["domain"] for d in matchings if d["id"] == "someid3"]
于 2009-01-16T19:52:12.653 に答える
0

私はこのような状況でフィルターを使うのが本当に好きです。関数とイテレータを受け取り、関数がTrueを返す要素のリストを返します(Python 3.xではイテレータを返します)。

>>> filter(lambda x: x['id'] == 'someid3', matchings)
<<< [{'domain': 'somedomain3.com', 'id': 'someid3'}]

リスト内包表記を使用すると、すべてのドメインのリストを取得できます。

>>> [x['domain'] for x in filter(lambda x: x['id'] == 'someid3', matchings)]
<<< ['somedomain3.com']
于 2011-03-31T16:52:26.027 に答える
0

リストに辞書があるという事実は、実際には問題ではありません。問題は、いくつかのプロパティが true であるリスト内の項目を見つけることです。そのために、@Soviutの答えのいくつかのバリエーションは、ループまたはリストの理解であり、一致が見つかるまで各項目を調べます。アイテムの固有の順序はないため、 bisectのような便利なものに頼ることさえできませんでした。

于 2009-01-16T19:49:47.760 に答える