【问题标题】:How to merge two or more dict into one dict with retaining multiple values of same key as list?如何将两个或多个字典合并为一个字典,并保留多个相同键的值作为列表?
【发布时间】:2019-03-23 02:53:03
【问题描述】:

我有两个或多个字典,我喜欢将它合并为一个,并保留与列表相同的键的多个值。我无法分享原始代码,所以请帮助我提供以下示例。

输入:

a= {'a':1, 'b': 2}
b= {'aa':4, 'b': 6}
c= {'aa':3, 'c': 8}

输出:

c= {'a':1,'aa':[3,4],'b': [2,6], 'c': 8}

【问题讨论】:

  • 保持价值观的历史是什么意思?
  • 你可以使用这个so link来计算你的答案

标签: python python-3.x alibaba-cloud alibaba-cloud-ecs


【解决方案1】:

我建议您阅读defaultdict:它允许您提供一个初始化丢失键的工厂方法,即如果查找但未找到键,它会通过调用factory_method(missing_key) 创建一个值。看看这个例子,它可能会让事情更清楚:

from collections import defaultdict

a = {'a': 1, 'b': 2}
b = {'aa': 4, 'b': 6}
c = {'aa': 3, 'c': 8}

stuff = [a, b, c]
# our factory method is the list-constructor `list`,
# so whenever we look up a value that doesn't exist, a list is created;
# we can always be sure that we have list-values
store = defaultdict(list)

for s in stuff:
    for k, v in s.items():
        # since we know that our value is always a list, we can safely append
        store[k].append(v)

print(store)

这具有为单个值创建单元素列表的“缺点”,但也许您可以解决这个问题。

【讨论】:

  • 实际上,不利的一面是有利的。鉴于未来的逻辑将不再需要区分标量和单元素列表。一致性是最好的。
【解决方案2】:

请在下方查找以解决您的问题。我希望这对你有用。

from collections import defaultdict

a = {'a':1, 'b': 2}
b =  {'aa':4, 'b': 6}
c={'aa':3, 'c': 8}

dd = defaultdict(list)

for d in (a,b,c): 
    for key, value in d.items():
        dd[key].append(value)

print(dd)

【讨论】:

    【解决方案3】:

    使用defaultdict 自动创建一个包含空列表的字典条目。

    要在单个循环中处理所有源字典,请使用itertools.chain

    主循环只是将当前项目中的一个值添加到下面的列表中 当前键。

    正如您所写,对于在某个键下只有一个项的情况, 你必须生成一个工作字典(使用字典理解), 仅限于具有仅包含一项的值(列表)的项目。 此类项目的值应仅包含第一个(也是唯一的)数字 来自源列表。

    然后使用此字典更新d

    所以整个脚本可以非常短,如下所示:

    from collections import defaultdict
    from itertools import chain
    a = {'a':1, 'b': 2}
    b = {'aa':4, 'b': 6}
    c = {'aa':3, 'c': 8}
    d = defaultdict(list)
    for k, v in chain(a.items(), b.items(), c.items()):
        d[k].append(v)
    d.update({ k: v[0] for k, v in d.items() if len(v) == 1 })
    

    如您所见,实际处理代码仅包含在 4(最后)行中。

    如果打印d,结果是:

    defaultdict(list, {'a': 1, 'b': [2, 6], 'aa': [4, 3], 'c': 8})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 2019-09-18
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多