我有一个字典列表
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
,因此这些是列表中的None
S。
我建议您改用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]}