我有一个python词典列表,看起来像这样:
[{key1: value1, key2: array1}, {key1: value2, key2: array2}, {key1: value3, key3: array3},...]
在我的例子中,其中一些词典对key1具有相同的值,例如,value1 = value3。我怎样才能得到一系列看起来像这样的词典?
[{key1: value1, key2: array1+array3}, {key1: value2, key2: array2},...]
其中“array1 + array3”是一个单独的数组,其中包含原始array1和array3数组的附加元素?
编辑:这不是按键合并;数组中的每个字典都具有完全相同的结构:{key1:“some_string”,key2:[数组]} - 我的问题是我希望在“some_string”上“合并”它们,所以[数组], key2的值将与列表中其他字典的数组连接,这些数组与key1的值具有相同的“some_string”。
答案 0 :(得分:0)
执行所需操作的最佳方法是重新构建数据,至少是暂时的。如果您要使用从value
映射到array
的字典(没有固定密钥),您可以将所有数据放在一个位置,并有效地检测何时出现重复值,以便您可以合并价值观在一起。如果需要,您可以在之后将单个词典重新转换为较小的词典列表。
尝试这样的事情:
merged = {}
for d in list_of_dicts:
if d["key1"] not in merged:
merged[d["key1"]] = d["key2"]
else:
merged[d["key1"]] += d["key2"]
# if necessary, put back into a list of dicts:
merged_list = [{"key1": k, "key2": v} for k, v in merged.items()]
最后列表的顺序是任意的。如果您想保留原始列表中的词条顺序,可以使用OrderedDict
merged
。
答案 1 :(得分:0)
由于您希望按key1
进行分组,因此您可以使用itertools.groupby()
。
from operator import itemgetter
from itertools import groupby
list_of_dicts = [{'key1': 1, 'key2': [1, 2]},
{'key1': 2, 'key2': [3, 4]},
{'key1': 1, 'key2': [5, 6]}]
grouped = groupby(sorted(list_of_dicts, key=itemgetter('key1')),
key=itemgetter('key1'))
result = [{'key1': k,
'key2': [elt for item in g for elt in item['key2']]}
for k, g in grouped]
print(result)
输出:
[{'key2': [1, 2, 5, 6], 'key1': 1}, {'key2': [3, 4], 'key1': 2}]