猿问

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

我创建了一个函数,它接受字典的多个参数,并返回一个连接的字典。我在网上研究了一段时间关于连接合并词典并测试了有趣的词典。它们都导致更新值(或覆盖它们)。


我的用例是传入字典,其中每个键都有一个值,并且想要一个具有相同或不同键的字典,以及每个键的值列表。这就是我对所谓的字典“串联”的定义。


这是两个非常基本的词典:


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 collections


def 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 rtn


def merge_dicts_2(*args):

    rtn = {}

    for input_dict in args:

        for key, value in input_dict.items():

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

    return rtn


if __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

谢谢!


天涯尽头无女友
浏览 221回答 2
2回答

有只小跳蛙

像这样的东西适用于任意数量的输入字典:import collectionsdef merge_dicts(*args):&nbsp; &nbsp; rtn = collections.defaultdict(list)&nbsp; &nbsp; for input_dict in args:&nbsp; &nbsp; &nbsp; &nbsp; for key, value in input_dict.items():&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rtn[key].append(value)&nbsp; &nbsp; return rtn诀窍是使用该defaultdict结构在新条目不存在时自动创建新条目。在这种情况下,访问尚不存在的键会将其创建为空列表。请注意,以上返回一个defaultdict对象。如果这是不可取的,您可以将其转换回 dict 或改用此函数:def merge_dicts(*args):&nbsp; &nbsp; rtn = {}&nbsp; &nbsp; for input_dict in args:&nbsp; &nbsp; &nbsp; &nbsp; for key, value in input_dict.items():&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rtn.setdefault(key, []).append(value)&nbsp; &nbsp; return rtn

慕斯709654

这样的事情怎么样?from functools import reducedef _merge_two_dicts(combined, dictionary):&nbsp; &nbsp; for key, value in dictionary.items():&nbsp; &nbsp; &nbsp; &nbsp; combined.setdefault(key, []).append(value)&nbsp; &nbsp; return combineddef merge_dicts(*dicts):&nbsp; &nbsp; return reduce(_merge_two_dicts, dicts, {})if __name__ == '__main__':&nbsp; &nbsp; a = {1: 'a', 2: 'b', 3: 'c'}&nbsp; &nbsp; b = {1: 'd', 2: 'e', 3: 'f', 4: 'g'}&nbsp; &nbsp; c = {1: 'h', 3: 'i', 5: 'j'}&nbsp; &nbsp; combined = merge_dicts(a, b, c)&nbsp; &nbsp; print(combined)&nbsp; &nbsp;&nbsp;输出:{1: ['a', 'd', 'h'], 2: ['b', 'e'], 3: ['c', 'f', 'i'], 4: ['g'], 5: ['j']}
随时随地看视频慕课网APP

相关分类

Python
我要回答