【问题标题】:Sum list of dicts of lists列表字典的总和列表
【发布时间】:2023-01-11 18:05:32
【问题描述】:

我有一个字典列表,字典中的每个值都是一个四元素列表:

my_dict=[
    {
      'prop1': [1, 2, 3, 4],
      'prop2': [1, 1, 0, 0]
    },
    {
      'prop1': [2, 3, 3, 1],
      'prop3': [1, 1, 0, 0]
    }
]

不写显式迭代就可以总结吗?

我想得到:

my_dict_sum={
      'prop1': [3, 5, 6, 5],
      'prop2': [1, 1, 0, 0],
      'prop3': [1, 1, 0, 0]
}

UPD:这样的事情可行,但我想知道如何使用mapzipfunctools在不编写两级迭代的情况下做同样的事情:

my_dict_sum = {}
for val in my_dict:
  for key,counts in val.items():
    if key in my_dict_sum :
        sum_dict[key] = list(map(lambda x,y: x+y, my_dict_sum[key], counts))
    else:
        my_dict_sum[key] = counts

【问题讨论】:

  • 请告诉我们您到目前为止尝试了什么以及为什么禁止迭代(提供更多上下文)。
  • 没有明确的迭代?这是什么,代码高尔夫挑战赛?
  • 那么为什么要在标签中添加loops呢?
  • @Gameplay 添加了我到目前为止尝试过的内容。
  • 您仍然没有提供为什么需要在没有显式迭代的情况下重写代码的原因,也没有显示这样做的尝试。

标签: python list loops dictionary


【解决方案1】:

这是一个带有显式循环的更简单版本,我觉得它比您的代码清晰得多,所以也许就足够了。

from collections import defaultdict

dicts = [
    {
      'prop1': [1, 2, 3, 4],
      'prop2': [1, 1, 0, 0]
    },
    {
      'prop1': [2, 3, 3, 1],
      'prop3': [1, 1, 0, 0]
    }
]

output = defaultdict(lambda: [0, 0, 0, 0])

for d in dicts:
    for k, l in d.items():
        for i, v in enumerate(l):
            output[k][i] += v

请注意,它仅在所有列表都恰好有四个项目时才有效。为了处理您不知道列表中有多少项的情况,您可以执行这个稍微复杂一点的版本:

output = defaultdict(list)

for d in dicts:
    for k, l in d.items():
        for i, v in enumerate(l):
            if i >= len(output[k]):
                output[k].append(v)
            else:
                output[k][i] += v

可以使用 reducemap 以及一堆 lambda 作为单行代码执行此操作,但这将是一团难以理解的混乱。如果您担心代码中有一堆内联循环,只需将其放入一个函数中并调用该函数即可。

【讨论】:

    猜你喜欢
    • 2018-11-19
    • 2020-08-09
    • 2015-12-19
    • 1970-01-01
    • 2022-01-22
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    相关资源
    最近更新 更多