2016-12-20 4 views
3

は、私がdictsの辞書を持っていると言う:リスト内包表記を使ってdictsのdictからすべてのメンバーdictキーのリストを作成できますか?

foo = { 
    'category': { 
     'key1': 'bar', 
     'key2': 'bar', 
     'key3': 'bar', 
    }, 
    'category2': { 
     'key4': 'bar', 
     'key5': 'bar', 
    }, 
} 

メンバー-dictsにあるすべてのキーの単一のリストを取得するには、次のように、私は機能を持っている:

def _make_list(): 
    baz = list() 
    for key,val in foo.items(): 
     baz += list(val.keys()) 
    return baz 

生成されたリストがどのように見えます:['key1', 'key2', 'key3', 'key4', 'key5', ]これは1ライナーリストの理解でこれを達成する方法はありますか?メンバーdictsのキーは常に一意です。ここで

+1

ところで、あなたの '+ =リスト(..)'本当にあるべき '.extend(...)' –

+0

と '.items()'本当に必要ではありません値; '.values()'で十分です。 – SethMMorton

+1

重複を含むすべてのキーのリストが本当に必要ですか?そうでない場合は、ettananyの答えに基づいて 'set(itertools.chain(* foo.values()))'がより適切かもしれません。 – Duncan

答えて

12

はそれを行うための一つの方法です:

>>> [k for d in foo.values() for k in d] 
['key1', 'key2', 'key3', 'key4', 'key5'] 
+0

お返事ありがとうございました!これが私が探していたものなので、受け入れられたとマークしました。それがどのように機能するか説明することを検討しますか? – Bryson

3

アプローチはitertools.chain()を使用することになります。

import itertools 

[k for k in itertools.chain(*(d.keys() for d in foo.values()))] 

何をしたいことは、必ずしもリストの内包ないコードは1行だけで、そして場合、あなたも(@Duncanが言及した)試すことができます。

list(itertools.chain(*foo.values())) 

出力:だけ使用している場合

>>> [k for k in itertools.chain(*(d.keys() for d in foo.values()))] 
['key3', 'key2', 'key1', 'key5', 'key4'] 
>>> 
>>> list(itertools.chain(*foo.values())) 
['key3', 'key2', 'key1', 'key5', 'key4'] 
+1

'[k for k in ...]'は 'list(...)'として記述するのが一般的ですが、 'd.keys()'は 'd'とすることができます。 ..) 'も崩壊することができる' list(itertools.chain(* foo.values())) ' – Duncan

+0

@ダンカン私はあなたに同意し、OPがそれを求めたのでリストの理解を使用したい。私はあなたの発言を追加するためにこの答えを編集しました! – ettanany

+1

今日、itertoolsチェーンの使い方を学びました。私はこれにも方法がありましたが、それほど清潔ではありませんでした。私もchain.fromiterable()を使っていました。 –

関連する問題