为什么关键错误在将字典列表与相同键结合在一起时组合在一起



我有一个字典列表

dictio =[{'key1':'value1'}, {'key1':'value2'}, {'key1':'value3'}, {'key2':'value4'}, {'key2':'value5'}]

我想要的

{key1:[value1, value2, value3], key2:[value4, value5]}

我的代码投掷密钥错误

{ k:[d[k] for d in dictio ] for k in dictio[0] }

我从stack获得了解决方案

d = {
    k: [d.get(k) for d in dictio ]
    for k in set().union(*dictio )
}

在这种情况下,没有

{'k2': [None, None, None, 'v4', 'v5'], 'k1': ['v1', 'v2', 'v3', None, None]}

尝试:

{ k:[d[k] for d in dicts if k in d] for k in set().union(*dicts) }

您的代码投掷,因为某些dicts没有所有键(例如第四个字典中的key1(。 if k in d修改了一个只能继续的人。

编辑:您也需要结合您的命令,否则您将不会获得所有键,只有第一个字典中的键。

如果您可以保证列表项目的指定顺序,则可以使用itertools.groupby

{k[0]: [d[k[0]] for d in g] for k, g in groupby(d, lambda x: tuple(x))}

示例

from itertools import groupby
d = [{'key1':'value1'}, {'key1':'value2'}, {'key1':'value3'}, {'key2':'value4'}, {'key2':'value5'}]
print({k[0]: [d[k[0]] for d in g] for k, g in groupby(d, lambda x: tuple(x))})
# {'key1': ['value1', 'value2', 'value3'], 'key2': ['value4', 'value5']}

您在使用for d in dict的字典上迭代,每次使用d.get(k)。如果字典不包含该键,则返回None,因此这些是列表中的NoneS。

我建议您改用defaultdict,例如:

from collections import defaultdict
result = defaultdict(list)
for subd in mydicts:
    for k, v in subd.items():
        result[k].append(v)

如果您想在构造字典后摆脱"默认"行为,则可以将结果包裹在新词典中,例如:

result = dict(result)

因此,对于给定的示例词典,这将产生:

>>> result
defaultdict(<class 'list'>, {'key1': ['value1', 'value2', 'value3'], 'key2': ['value4', 'value5']})
>>> dict(result)
{'key1': ['value1', 'value2', 'value3'], 'key2': ['value4', 'value5']}

如果字典有多个键,则以上将有效。此外,我们只能使一个越过字典列表。

Note :请在内置功能/类(如dict(之后命名您的变量,因为现在您覆盖了dict类的引用。

您的原始帖子中的代码需要轻微的修改才能使其按预期

进行工作
dictio =[{'key1':'value1'}, {'key1':'value2'}, {'key1':'value3'}, {'key2':'value4'}, {'key2':'value5'}]
d = {
    k: [d.get(k) for d in dictio if d.get(k) is not None]
    for k in set().union(*dictio )
}
print(d)

输出:

{'key1': ['value1', 'value2', 'value3'], 'key2': ['value4', 'value5']}

注意is not None检查的用法,根据PEP-8,这是首选的方法。

打印

的不同方法
super_dict = {}
for d in dictio:
    for l, m in d.items():  
        super_dict.setdefault(l, []).append(m)
super_dict
{'key1': ['value1', 'value2', 'value3'], 'key2': ['value4', 'value5']}

带有集合集

import collections
super_dict1 = collections.defaultdict(set)
for d in dictio:
    for k, v in d.items(): 
        super_dict1[k].add(v)
dict(super_dict1)
{'key1': {'value1', 'value2', 'value3'}, 'key2': {'value4', 'value5'}}

列表理解

combined_key_set= {key for d in dictio for key in d}
su_di = {key : [d[key] for d in dictio if key in d] for key in combined_key_set}
su_di
{'key2': ['value4', 'value5'], 'key1': ['value1', 'value2', 'value3']}

理解

{key : [d[key] for d in dictio if key in d] for key in [key for d in dictio for key in d]}

最新更新