Python:使用字典理解附加到值列表

anu*_*rag 7 dictionary python-3.x dictionary-comprehension

我有以下场景 - 考虑如下的字典列表(输入):

data = [{'key1' : 'k1v1', 'key2': 'k2v1'}, {'key1': 'k1v2', 'key2': 'k2v2'}, 
{'key1': 'k1v3', 'key2': 'k2v3'}, {'key1': 'k1v4', 'key2': 'k2v4'}]
Run Code Online (Sandbox Code Playgroud)

可以看出,字典中的键是相同的。所以我想要做的是以下(期望的输出):

{'key1': ['k1v1', 'k1v2', 'k1v3', 'k1v4'], 'key2': ['k2v1', 'k2v2', 'k2v3', 'k2v4']}
Run Code Online (Sandbox Code Playgroud)

为了实现这一点,我可以使用以下简单的直接嵌套循环:

data_dict = dict()
for d in data:
    for k, v in d.items():
        if k in data_dict:
            data_dict[k].append(v)
        else:
            data_dict[k] = [v]
Run Code Online (Sandbox Code Playgroud)

问题:我们可以使用字典理解来做到这一点吗?换句话说,我们可以在字典理解中附加到现有的值列表吗?

小智 3

这是我能做的最好的事情:

\n
d = {}\nfor k in data[0].keys():\n    d[k] = list(d[k] for d in ds)\n
Run Code Online (Sandbox Code Playgroud)\n

这是一个更接近字典理解的解决方案

\n
data_dict = {\n    k: [d.get(k) for d in data]\n    for k in set().union(*data)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

以下语法会产生最快计时的代码:

\n
d = {}\nfor k in data[0].keys():\n    d[k] = list(d[k] for d in ds)\n
Run Code Online (Sandbox Code Playgroud)\n