【问题标题】:Merge values in a list of dictionaries on key在键上的字典列表中合并值
【发布时间】:2022-01-13 01:12:45
【问题描述】:

我有那个字典数组:

[{'dog': 'dog-1'}, {'monkey': 'monkey-1'}, {'buffalo': 'buffalo-6'}, {'dog': 'dog-2'},{'pig': 'pig-3'}, {'monkey': 'monkey-6'}, {'monkey': 'monkey-6'}]

而且我需要将每个拥有相同密钥的人放在同一个字典中。我需要那个结果:

[{'dog': ['dog-1', 'dog-2']}, {'monkey': ['monkey-1', 'monkey-6', 'monkey-6']}, {'buffalo': ['buffalo-6']}, {'pig': ['pig-3']}]

【问题讨论】:

  • 到目前为止你尝试了什么
  • 为什么是一个包含一个键的字典列表而不是一个包含所有键的字典?

标签: python arrays list dictionary


【解决方案1】:

使用defaultdict

from collections import defaultdict

lst = [{'dog': 'dog-1'}, {'monkey': 'monkey-1'}, {'buffalo': 'buffalo-6'}, {'dog': 'dog-2'},{'pig': 'pig-3'}, {'monkey': 'monkey-6'}, {'monkey': 'monkey-6'}]

output = defaultdict(list)

for d in lst:
    for k,v in d.items():
        output[k].append(v)

【讨论】:

    【解决方案2】:

    一般的想法是,当您遍历列表时,您想知道您是否到达了一个字典,其键是您以前见过的。如果您已经看到该键,那么您希望将其值附加到匹配键的值;如果没有,您想创建一个具有默认值的新键(在本例中为空列表)。您可以使用dict.setdefault 来执行此操作。

    out = {}
    for d in lst:
        for k, v in d.items():
            out.setdefault(k, {}).setdefault(k, []).append(v)
    out = list(out.values())
    

    输出:

    [{'dog': ['dog-1', 'dog-2']},
     {'monkey': ['monkey-1', 'monkey-6', 'monkey-6']},
     {'buffalo': ['buffalo-6']},
     {'pig': ['pig-3']}]
    

    【讨论】:

      猜你喜欢
      • 2022-12-18
      • 2015-08-25
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 2021-09-17
      • 2015-01-10
      相关资源
      最近更新 更多