我有以下格式的词典列表:
foo = [
{'a': 'x', 'b': 'y', 'c': 'z'},
{'a': 'j', 'c': 'z'}
]
Run Code Online (Sandbox Code Playgroud)
我想将此字典列表分组为一个字典,例如:
bar = {
'a': ['x', 'j'],
'b': ['y', None],
'c': ['z', 'z']
}
Run Code Online (Sandbox Code Playgroud)
我目前正在做的是,遍历所有字典foo并创建键列表,然后再次遍历相同的键来创建bar。我想知道是否有更简单的方法来完成此任务。有人可以帮忙吗?
Nay*_*.py 11
我只是要在这里补充Alex Hall解决方案,这样它就不会返回很多“None”值:
def merge_dictionary_list(dict_list):
return {
k: [d.get(k) for d in dict_list if k in d] # explanation A
for k in set().union(*dict_list) # explanation B
}
Run Code Online (Sandbox Code Playgroud)
解释:
{}就是字典理解k字典 ( ) 实际上具有该键,则获取当前键的值。dOBS:如果没有if k in d表达式,可能会在数组中附加一堆None
值,以防字典列表包含不同类型的键。
set().union。毕竟我们在集合数据结构中只能有不同的元素。如果您想以传统方式进行操作,只需执行以下操作:
def merge_list_of_dictionaries(dict_list):
new_dict = {}
for d in dict_list:
for d_key in d:
if d_key not in new_dict:
new_dict[d_key] = []
new_dict[d_key].append(d[d_key])
return new_dict
Run Code Online (Sandbox Code Playgroud)
我认为第一个解决方案看起来更优雅,但第二个解决方案更清晰/可读。
亲切的问候 :)
Ale*_*all 10
bar = {
k: [d.get(k) for d in foo]
for k in set().union(*foo)
}
Run Code Online (Sandbox Code Playgroud)
谷歌的事情: