首页 文章

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

提问于
浏览
-1

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

    做你想做的最好的方法是重新构建你的数据,至少是暂时的 . 如果您要使用从 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()]
    

    最后列表的顺序是任意的 . 如果要保留原始列表中的dicts顺序,可以使用 OrderedDict 表示 merged .

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

相关问题