【问题标题】:dictionary math Python字典数学 Python
【发布时间】:2020-10-09 10:33:47
【问题描述】:

我有一个字典,其中有几个值分配给 1 个键。 如何计算分配给特定键的值的平均值?

例如 dict:{'name' = 1,2,3,3,1}--> mean = 2

rows = (("name", 0.4),
        ("name", "0.3"),
        ("name", "0.9"),
        ("name", "1.2"),
        ("name", "1.1"))

data = {} # dictionary with several values
for row in rows:
data.setdefault(row[0],[]).append(row[1])
print(data)

for x in data.values():
# calculate mean(x)

【问题讨论】:

  • 你知道如何在没有 Python 的情况下计算均值吗?只需在 Python 中做同样的事情。

标签: dictionary math python-3.6


【解决方案1】:

使用itertools.groupby

import itertools  #groupby
import operator   #itemgetter

rows = (("alice", "0.4"),
        ("alice", "0.3"),
        ("bob", "0.9"),
        ("charlie", "1.2"),
        ("charlie", "1.1"))

grouped = itertools.groupby([(label, float(value)) for (label, value) in sorted(rows)], operator.itemgetter(0))
# [('alice', [("alice", 0.4), ("alice", 0.3)]),
#  ('bob', [("bob", 0.9)]),
#  ('charlie', [("charlie", 1.2), ("charlie", 1.1)])]

def average(g):
  l = [value for label,value in g]
  return sum(l) / len(l)

means = [(label, average(g)) for (label, g) in grouped]
# [('alice', 0.35), ('bob', 0.9), ('charlie', 1.15)]

说明:首先我们按名称分组。这是通过对列表进行排序,然后使用键operator.itemgetter(0) 调用groupby 来完成的,它相当于lambda t: t[0]。请注意,排序是按字典顺序排序的;特别是按名称排序,因为名称在成对中排在第一位。

然后我们定义一个average 函数来计算每个组的平均值,并使用列表推导将其应用于每个组。

【讨论】:

    【解决方案2】:

    谢谢 Stef,花了一些时间来理解它是如何工作的......:) 它也适用于 2 个值吗? '爱丽丝', 1, 0.4 '爱丽丝', 3, 0.3 '爱丽丝',2, 0.5 按名称分组... 按第一个值排序 用于计算的第二个值...

    结果: 爱丽丝,[0.4, 0.5, 0.3]

    最好的问候

    【讨论】:

      【解决方案3】:

      我对 stefs 解决方案有疑问。我拿了代码并用 Python 3.7 运行它,没有问题。然后我用 Python 3.6 运行脚本,计算因错误而中止。

      【讨论】:

        【解决方案4】:
        sum(map(float, x))/len(x)
        

        或者考虑像 numpy 这样的库,它有一个 numpy.mean() 方法

        【讨论】:

        • 这是类型错误:TypeError: unsupported operand type(s) for /: 'map' and 'int'
        • 我运行了您提供的代码并添加了上面的行,并且它有效。听起来您缺少 sum 函数的右括号,它应该出现在 / 之前
        猜你喜欢
        • 2017-01-30
        • 2017-12-03
        • 2019-03-08
        • 1970-01-01
        • 1970-01-01
        • 2021-07-15
        • 2016-02-04
        • 1970-01-01
        • 2016-06-14
        相关资源
        最近更新 更多