【问题标题】:Several identical dictionaries component mean几个相同的字典组件均值
【发布时间】:2021-06-16 02:08:36
【问题描述】:

我有几个具有相同结构的 Python3 字典,将字符串标签映射到实际值。例如,对于 4 个条目,数据集可能如下所示:

{"a": 1.2, "b": 3.2, "c":5.65}

{"a": 2.5, "b": 3.8, "c":9.65}

{"a": 2.8, "b": 3.2, "c":2.65}

{"a": 1.8, "b": 1.2, "c":3.65}

我想对这些组件进行组件平均,所以最终结果应该如下所示:

{"a": 2.07, "b": 2.85, "c":5.4}

我知道如何使用 for 循环将值相加并将每个条目除以最后的计数来解决问题,例如

def final_results(scores):
result = {}
for score in scores:
    for k, v in score.items():
        if k not in result:
            result[k] = v
        else:
            result[k] += v
for k, v in result:
    result[k] = v / len(scores)
return result

,但我正在寻找一种以功能方式解决问题的方法,使用 lambda、map、filter 等。有吗?

【问题讨论】:

  • 旁白:您是否考虑过使用例如熊猫?这可能更适合您的问题,即使它不是直接起作用的。
  • 我已经有很多依赖项,所以我会避免添加另一个,但如果没有“普通”可用的话,这将是一个解决方案
  • 好吧,使用 Pandas DataFrame,您可能会使用df.mean(axis=0) 来获得每列的平均值。
  • 将研究 Pandas 解决方案。不过,仍然对 plain python3 感到好奇。

标签: python python-3.x dictionary functional-programming average


【解决方案1】:

还有来自toolz的库解决方案:

from toolz import merge_with

d1 = {"a": 1.2, "b": 3.2, "c":5.65}
d2 = {"a": 2.5, "b": 3.8, "c":9.65}
d3 = {"a": 2.8, "b": 3.2, "c":2.65}
d4 = {"a": 1.8, "b": 1.2, "c":3.65}

merge_with(lambda args: sum(args)/len(args), d1, d2, d3, d4)

在库没有外部依赖项的意义上,它是纯 Python。

【讨论】:

  • 不幸的是,这并没有回答问题,因为我要求纯 python 解决方案。
【解决方案2】:

我假设你有一个字典列表:

data = [{'a': 1.2, 'b': 3.2, 'c': 5.65},
        {'a': 2.5, 'b': 3.8, 'c': 9.65}, 
        {'a': 2.8, 'b': 3.2, 'c': 2.65}, 
        {'a': 1.8, 'b': 1.2, 'c': 3.65}]

在纯 Python 中的一些功能性单行(不包括 itertools 导入)可能是:

from itertools import reduce

{key: value / len(data) for key, value in 
 reduce(lambda item1, item2: {key: value + item2[key] 
            for key, value in item1.items()}, 
        data, 
        {key: 0 for key in data[0]}).items()}

给了

{'a': 2.075, 'b': 2.8499999999999996, 'c': 5.3999999999999995}

使用 Pandas,您可以执行以下操作:

from pandas import DataFrame

DataFrame(data).mean()

导致

a    2.075
b    2.850
c    5.400
dtype: float64

技术上是 Pandas 系列,因此在其输出中包含 dtype。如果您想将该结果转换为上述字典,请使用:

DataFrame(d).mean().to_dict()

得到

{'a': 2.075, 'b': 2.8499999999999996, 'c': 5.3999999999999995}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多