0

パフォーマンス、エレガンス、可読性は「最善の方法」の要件です

私は辞書の配列を持っています:

items = [
    {'id1' : 1, 'id2' : 2, 'other' : 'xxx'},
    {'id1' : 1, 'id2' : 3, 'other' : 'yyy'},
    {'id1' : 2, 'id2' : 4, 'other' : 'zzz'}
]

結果は次のようになります: ids = [1,2,3,4](id1 と id2 のリスト)

編集: このようなもの:

ids = []
for item in items:
   if item.id1 not in ids:
       ids.append(item.id1)
   if item.id2 not in ids:
       ids.append(item.id2)
4

2 に答える 2

4
>>> set(x for y in items for x in y.values())
set([1, 2, 3, 4])

更新された質問の更新

>>> set(v for y in items for (k,v) in y.items() if k.startswith('id'))
set([1, 2, 3, 4])
于 2013-03-22T13:11:45.950 に答える
3

itertools.chain.from_iterable()これは、IDの値を生成するネストされたジェネレータ式をフラット化するために使用することで、非常に簡単に実行できます。すべてのキーは文字列になり、で始まるもの"id"はIDを指定すると想定します。次に、これらの値のセットを作成して、重複を削除します。

from itertools import chain

set(chain.from_iterable((value for name, value in item.items() 
                         if name.startswith("id"))
                        for item in items))

本当にリストが必要な場合は、セットからリストを作成できますが、ほとんどの場合、セットはそのままで問題ありません。セットには順序がないことに注意してください。したがって、順序が必要な場合はsorted()、たとえばを使用する必要があります。

itertools.chain.from_iterable()反復可能をフラット化するための最も効率的で読みやすい方法です。

IDが何であるかに関しては、仕様が明確ではありません。IDを定義するキーのセットがある場合は、内部ジェネレーター式のif句として次のようなものがより適切な場合があります。

if name in {"id1", "id2"}
于 2013-03-22T13:11:49.617 に答える