10

私はそのような辞書のリストを持っています:

dicts = [
    {'key_a': valuex1,
     'key_b': valuex2,
     'key_c': valuex3},

    {'key_a': valuey1,
     'key_b': valuey2,
     'key_c': valuey3},

    {'key_a': valuez1,
     'key_b': valuez2,
     'key_c': valuez3}
]

私はこれらを取り、次のような大きな辞書を作成したいと思います。

big_dict = {
    'key_a': [valuex1, valuey1, valuez1],
    'key_b': [valuex2, valuey2, valuez2],
    'key_c': [valuex3, valuey3, valuez3]
}

これを行うためのエレガントな「zip」のような方法はありますか?

すべてのキーは常に同一になります。

4

5 に答える 5

15
big_dict = {}
for k in dicts[0]:
    big_dict[k] = [d[k] for d in dicts]

または、dictの理解で:

{k: [d[k] for d in dicts] for k in dicts[0]}
于 2012-07-18T01:58:05.107 に答える
5

を使用できますcollections.defaultdict。このソリューションの利点は、キーが辞書間で一貫している必要がなく、最小のO(n)時間計算量を維持できることです。

from collections import defaultdict

dict_list = [{'key_a': 'valuex1', 'key_b': 'valuex2', 'key_c': 'valuex3'},
             {'key_a': 'valuey1', 'key_b': 'valuey2', 'key_c': 'valuey3'},
             {'key_a': 'valuez1', 'key_b': 'valuez2', 'key_c': 'valuez3'}]            

d = defaultdict(list)
for myd in dict_list:
    for k, v in myd.items():
        d[k].append(v)

結果:

print(d)

defaultdict(list,
            {'key_a': ['valuex1', 'valuey1', 'valuez1'],
             'key_b': ['valuex2', 'valuey2', 'valuez2'],
             'key_c': ['valuex3', 'valuey3', 'valuez3']})
于 2018-09-12T17:37:00.907 に答える
2

すべてのdictに同じキーのセットがある場合、これは機能します。

dict((k, [d[k] for d in dictList]) for k in dictList[0])

それらが異なるキーを持っている可能性がある場合は、最初に、さまざまなdictのキーに対してset unionを実行して、キーのセットを作成する必要があります。

allKeys = reduce(operator.or_, (set(d.keys()) for d in dictList), set())

次に、いくつかのdictでキーの欠落から保護する必要があります。

dict((k, [d[k] for d in [a, b] if k in d]) for k in allKeys)
于 2012-07-18T01:58:46.983 に答える
0

サードパーティのライブラリを使用することに満足している場合は、Pandasを使用できます。pd.DataFrameコンストラクターは、辞書のリストを直接受け入れます。

import pandas as pd

res = pd.DataFrame(dictList).to_dict(orient='list')

{'key_a': ['valuex1', 'valuey1', 'valuez1'],
 'key_b': ['valuex2', 'valuey2', 'valuez2'],
 'key_c': ['valuex3', 'valuey3', 'valuez3']}
于 2018-09-12T17:43:37.127 に答える
-1

次の方法で辞書をマージできます。

def merge_dicts(dict_list, separator=''):
    """
    Merges list of dictionaries to a single dictionary, Concatenates values with the same key.
    :param dict_list: list of dictionaries to be merged.
    :param separator: separator to be inserted between values of same key.
    :return: Merged dictionary.
    """
    return {k1: separator.join([d[k1] for d in dict_list if k1 in d])
            for k1 in set(reduce(lambda x, y: x+y, [k.keys() for k in dict_list]))
    }
于 2014-12-03T18:39:04.357 に答える