2016-10-26 18 views
1

必ずしも同じキーを持っていない辞書のリストがあります。私は特定のキーを持つ各辞書に含まれている値の新しいリストを作成しようとしています。特定のキーを持つ各辞書の辞書リストからPythonを作成

など。

dict1 = {'key1': 1, 'key2': 2, 'key4': 4} 
dict2 = {'key2': 2, 'key3': 3} 
dict3 = {'key1': 1, 'key2': 2, 'key3': 3} 

dict_list = [dict1, dict2, dict3] 

は今、私は次のようにdict_listからリストを作成しようとしている:「KEY2」以来、うまく機能

key2vals = [dict['key2'] for dict in dict_list] 
print(key2vals) 
    [2, 2, 2] 

は、リスト内のすべての辞書に含まれています。しかし、すべての辞書に表示されないキーを試してみると、間違いがあります。例えば。 'key1':

>>> key1vals = [dict['key1'] for dict in dict_list] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <listcomp> 
KeyError: 'key1' 

私は以下のような何かができない短くて簡単な方法がありますか?

# This does not work 
key1vals = [dict['key1'] if 'key1' in dict for dict in dict_list] 

これを達成する最もPythonicな方法は何ですか?

ANSWER: のためとあれば文が逆転されている必要がありますの順序:

key1vals = [dict['key1'] for dict in dict_list if 'key1' in dict ] 

また、AbrahamBとDJVの提案を、私はせずに、これらの辞書にデフォルト値を追加することができました検索キー:

[dict.get('key1', 0) for dict in dict_list] 

答えて

2
dict1 = {'key1': 1, 'key2': 2, 'key4': 4} 
dict2 = {'key2': 2, 'key3': 3} 
dict3 = {'key1': 1, 'key2': 2, 'key3': 3} 

dict_list = [dict1, dict2, dict3] 

keys = ['key1', 'key2', 'key3', 'key4', 'key5'] 
for key in keys: 
    values = [d[key] for d in dict_list if key in d] 
    print(values) 
[1, 1] 
[2, 2, 2] 
[3, 3] 
[4] 
[] 

しかし、ここでは同じ項目の検索が2回行われます:key in dd[key]。あなたはそれを避けることができます。

values = list(filter(None, (d.get(key) for d in dict_list))) 

または

values = [i for i in (d.get(key) for d in dict_list) if i is not None] 

を追加しました:あなたがコメントで述べたように をキーが辞書にない場合は、あなたが実際に0を必要としています。ただ、デフォルト値でgetメソッドを使用します。

values = [d.get(key, 0) for d in dict_list] 
[1, 0, 1] 
[2, 2, 2] 
[0, 3, 3] 
[4, 0, 0] 
[0, 0, 0] 
2

絶対に。 dictには "get"メソッドがあり、これを使用することができます。例

なしタイプを返します
a = {} 
a.get('this-does-not-exist') 

については

今、あなたは、このような何も見つからない場合は、デフォルト値を返すように、手の込んだ得ることができます:空のリスト[]を返します

a = {} 
a.get('this-does-not-exist', []) 

を。

+0

元のサンプルの問題でa.get( 'key'、 'defaultValue')形式を使用できますか?私はもっ​​と大きな画像でそれを使う方法にはかなり従っていません。 –

+0

DJVは別のコメントで答えを提供しました:[dict_listのdのためのd.get( 'key1'、0)] –

1

あなたはかなり接近していた:

key1vals = [d['key1'] for d in dict_list if 'key1' in d] 

すべてのキーの値を取得するには:

印刷し
all_keys = {key for d in dict_list for key in d} 

result_dict = {} 
for key in all_keys: 
    result_dict[key] = [d[key] for d in dict_list if key in d] 

print(result_dict) 

{'key1': [1, 1], 'key4': [4], 'key3': [3, 3], 'key2': [2, 2, 2]} 
0

感謝を提案するために!私は単に「のために」逆に、別の解決策を見つけたし、私の以前の試みで、文が「あれば」:

>>> key1vals = [dict['key1'] for dict in dict_list if 'key1' in dict] 
>>> key1vals 
[1, 1] 
>>> 

は、フィルタまたはメソッド「取得」がこれに好まれるでしょうか?

+0

それはクリーナーなのでgetを使うことをお勧めします。あなたはすでにdict ['key1']でキーを呼び出しているので、dict.get( 'key1')のように短くなります – AbrahamB

+0

いずれにしても。ええ、それはもっと短いですが、私は '' if 'key1 in d'言語は少しPythonで読みやすくなるかもしれないと思います。そのアプローチは文字通り辞書がキー「key1」を持っているかどうかをチェックします。いずれにしても間違って行くことはできません。 – blacksite

+0

"else"ステートメントを追加することはできますか?>>> key1vals = [dict elseの[key1]の場合、dict_listのdictの[dict ['key1']]それから私はkey1valsが[1、0、1]を含むことを望むでしょう。 –

関連する問題