我有几个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等。有吗?
我假设您有一个dicts列表:
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。如果您想将结果转换为如上所述的dict,请使用:
DataFrame(d).mean().to_dict()
获取
{'a': 2.075, 'b': 2.8499999999999996, 'c': 5.3999999999999995}
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,因为库并没有外部依赖关系。