为了账号安全,请及时绑定邮箱和手机立即绑定

如何最好地合并来自多个字典的值?

如何最好地合并来自多个字典的值?

天涯尽头无女友 2021-08-05 15:30:51
我创建了一个函数,它接受字典的多个参数,并返回一个连接的字典。我在网上研究了一段时间关于连接合并词典并测试了有趣的词典。它们都导致更新值(或覆盖它们)。我的用例是传入字典,其中每个键都有一个值,并且想要一个具有相同或不同键的字典,以及每个键的值列表。这就是我对所谓的字典“串联”的定义。这是两个非常基本的词典:a = {1: 'a', 2: 'b', 3: 'c'}b = {1: 'd', 2: 'e', 3: 'f'}这是函数:def merge_dict(*args:dict):    result = {}    for arg in args:        if not isinstance(arg, dict):            return {}        result_keys = result.keys()        for key, value in arg.items():            if key not in result_keys:                result[key] = [value]            else:                result[key].append(value)    return result输出是:print(merge_dict(a, b)){1: ['a', 'd'], 2: ['b', 'e'], 3: ['c', 'f']}我可以对元组、数组、Numpy 数组等执行相同的操作。请注意,此函数非常简单,除了作为一个dict实例之外,它不会进一步清理输入或验证数据结构。但是,我想知道是否有更有效或“pythonic”的方式来做到这一点。请随时添加您的输入。考虑使用不同的键添加这些字典:c = {4: 'g', 5: 'h', 6: 'i'}d = {4: 'j', 5: 'k', 6: 'l'}输出是:print(merge_dict(a, b, c, d)){1: ['a', 'd'], 2: ['b', 'e'], 3: ['c', 'f'], 4: ['g', 'j'], 5: ['h', 'k'], 6: ['i', 'l']}我很快就会研究嵌套数据结构。由于您的回答,这就是我所做的:import collectionsdef merge_dicts_1(*args):    rtn = collections.defaultdict(list)    for input_dict in args:        for key, value in input_dict.items():            rtn[key].append(value)    return rtndef merge_dicts_2(*args):    rtn = {}    for input_dict in args:        for key, value in input_dict.items():            rtn.setdefault(key, []).append(value)    return rtnif __name__ == "__main__":    a = {1: 'a', 2: 'b', 3: 'c'}    b = {1: 'd', 2: 'e', 3: 'f'}    c = {4: 'g', 5: 'h', 6: 'i'}    d = {4: 'j', 5: 'k', 6: 'l'}    e = merge_dicts_1(a, b, c, d)    f = merge_dicts_2(a, b, c, d)    print(e)    print(f)    print(e == f)这将打印以下内容:defaultdict(<class 'list'>, {1: ['a', 'd'], 2: ['b', 'e'], 3: ['c', 'f'], 4: ['g', 'j'], 5: ['h', 'k'], 6: ['i', 'l']}){1: ['a', 'd'], 2: ['b', 'e'], 3: ['c', 'f'], 4: ['g', 'j'], 5: ['h', 'k'], 6: ['i', 'l']}True谢谢!
查看完整描述

2 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

像这样的东西适用于任意数量的输入字典:


import collections


def merge_dicts(*args):

    rtn = collections.defaultdict(list)

    for input_dict in args:

        for key, value in input_dict.items():

            rtn[key].append(value)

    return rtn

诀窍是使用该defaultdict结构在新条目不存在时自动创建新条目。在这种情况下,访问尚不存在的键会将其创建为空列表。


请注意,以上返回一个defaultdict对象。如果这是不可取的,您可以将其转换回 dict 或改用此函数:


def merge_dicts(*args):

    rtn = {}

    for input_dict in args:

        for key, value in input_dict.items():

            rtn.setdefault(key, []).append(value)

    return rtn


查看完整回答
反对 回复 2021-08-05
?
慕斯709654

TA贡献1840条经验 获得超5个赞

这样的事情怎么样?


from functools import reduce


def _merge_two_dicts(combined, dictionary):

    for key, value in dictionary.items():

        combined.setdefault(key, []).append(value)

    return combined


def merge_dicts(*dicts):

    return reduce(_merge_two_dicts, dicts, {})



if __name__ == '__main__':

    a = {1: 'a', 2: 'b', 3: 'c'}

    b = {1: 'd', 2: 'e', 3: 'f', 4: 'g'}

    c = {1: 'h', 3: 'i', 5: 'j'}


    combined = merge_dicts(a, b, c)

    print(combined)    

输出:


{1: ['a', 'd', 'h'], 2: ['b', 'e'], 3: ['c', 'f', 'i'], 4: ['g'], 5: ['j']}


查看完整回答
反对 回复 2021-08-05
  • 2 回答
  • 0 关注
  • 220 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信