当键具有特定值时合并python词典

时间:2016-07-28 18:30:45

标签: python dictionary

我有一个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”。

2 个答案:

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