我想将字典列表与列表作为值合并。给定
sudo ln -s /lib64/libopenblas64p_.so.0 ~/.julia/packages/Arpack/*/deps/lib/libopenblas64_.so.0
我想要的结果将是
arr[0] = {'number':[1,2,3,4], 'alphabet':['a','b','c']}
arr[1] = {'number':[3,4], 'alphabet':['d','e']}
arr[2] = {'number':[6,7], 'alphabet':['e','f']}
您能推荐任何紧凑的代码吗?
答案 0 :(得分:2)
如果您知道这些是dict
中唯一的键,则可以对其进行硬编码。如果不是那么简单,请显示一个复杂的示例。
from pprint import pprint
arr = [
{
'number':[1,2,3,4],
'alphabet':['a','b','c']
},
{
'number':[3,4],
'alphabet':['d','e']
},
{
'number':[6,7],
'alphabet':['e','f']
}
]
merged_arr = {
'number': [],
'alphabet': []
}
for d in arr:
merged_arr['number'].extend(d['number'])
merged_arr['alphabet'].extend(d['alphabet'])
pprint(merged_arr)
输出:
{'alphabet': ['a', 'b', 'c', 'd', 'e', 'e', 'f'],
'number': [1, 2, 3, 4, 3, 4, 6, 7]}
答案 1 :(得分:0)
arr = [{'number':[1,2,3,4], 'alphabet':['a','b','c']},{'number':[3,4], 'alphabet':['d','e']},{'number':[6,7], 'alphabet':['e','f']}]
dict = {}
for k in arr[0].keys():
dict[k] = sum([dict[k] for dict in arr], [])
print (dict)
输出:
{'number': [1, 2, 3, 4, 3, 4, 6, 7], 'alphabet': ['a', 'b', 'c', 'd', 'e', 'e', 'f']}
答案 2 :(得分:0)
编辑:如@pault所述,以下解决方案具有二次复杂性,因此不建议用于大型列表。有更多的最佳解决方法。
但是,如果您正在寻找紧凑和相对简单的内容,请继续阅读。
如果您想使用更具功能性的表格,可以使用以下两种方法:
arr = [{'number':[1,2,3,4], 'alphabet':['a','b','c']},{'number':[3,4], 'alphabet':['d','e']},{'number':[6,7], 'alphabet':['e','f']}]
keys = ['number', 'alphabet']
merge_arr = {key: reduce(list.__add__, [dict[key] for dict in arr]) for key in keys}
print arr
输出:
{'alphabet': ['a', 'b', 'c', 'd', 'e', 'e', 'f'], 'number': [1, 2, 3, 4, 3, 4, 6, 7]}
此不会递归合并。
如果您希望它使用任意字典中没有的任意键,请使用:
keys = {k for k in dict.keys() for dict in arr}
merge_arr = {key: reduce(list.__add__, [dict.get(key, []) for dict in arr]) for key in keys}
答案 3 :(得分:0)
以下是使用defaultdict
来更轻松地收集项目的代码。您可以将结果保留为defaultdict
,但此版本会将其转换为常规字典。该代码可与任何键一起使用,并且各字典中的键可以不同,只要这些值是列表即可。因此,此答案比到目前为止给出的其他答案更为笼统。
from collections import defaultdict
arr = [{'number':[1,2,3,4], 'alphabet':['a','b','c']},
{'number':[3,4], 'alphabet':['d','e']},
{'number':[6,7], 'alphabet':['e','f']},
]
merge_arr_default = defaultdict(list)
for adict in arr:
for key, value in adict.items():
merge_arr_default[key].extend(value)
merge_arr = dict(merge_arr_default)
print(merge_arr)
打印结果是
{'number': [1, 2, 3, 4, 3, 4, 6, 7], 'alphabet': ['a', 'b', 'c', 'd', 'e', 'e', 'f']}