如何在Python中组合多个字典的列表?

时间:2019-08-03 16:47:56

标签: python list dictionary

我想将字典列表与列表作为值合并。给定

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']}

您能推荐任何紧凑的代码吗?

4 个答案:

答案 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']}