当前位置: 代码迷 >> python >> 在不使用 .values() 等的情况下查找字典中值的均值
  详细解决方案

在不使用 .values() 等的情况下查找字典中值的均值

热度:74   发布时间:2023-06-27 21:24:27.0

我有一本字典,看起来像:

G={'E': 18.0, 'D': 17.0, 'C': 19.0, 'B': 15.0, 'A': 0}

我必须使用简单的for循环找到值的平均值,例如 mean(18,17,19,15,0) for而不使用像.values().items()等内置函数。 我尝试了以下操作,但出现错误:

d=[float(sum(values)) / len(values) for key, values in G]
    return (d)   
ValueError: need more than 1 value to unpack

有人可以帮我解决这个问题吗????

如果您使用 numpy:

import numpy as np

np.array(list(dict.values())).mean()

要使用“简单的 for 循环”执行此操作,请使用您的约束而不是使用 dict 方法:

G = {'E': 18.0, 'D': 17.0, 'C': 19.0, 'B': 15.0, 'A': 0}


count = 0
_sum = 0
for key in G:
    count += 1
    _sum += G[key]

print('this is the mean: ', _sum/count)

如果你应该避免使用 dict 方法,显然这是一个学术练习。

没有这个限制:

标准库中的statistics模块有一个mean方法,这是我的第一个想法(因为标准库不需要第三方包。):

>>> G={'E': 18.0, 'D': 17.0, 'C': 19.0, 'B': 15.0, 'A': 0}
>>> from statistics import mean
>>> mean(G[k] for k in G)
13.8

像 numpy 和 pandas 这样的第三方包有一个带有mean方法的对象:

>>> from numpy import array
>>> array([G[k] for k in G]).mean()
13.8

>>> from pandas import Series
>>> Series([G[k] for k in G]).mean()
13.8

如果我们允许自己使用values()方法,通过可迭代解包,这会变得更简单一些。 出于某种原因,其他答案违反了该条件,所以我想我应该展示更有效的方法:

>>> Series([*G.values()]).mean()
13.8
import numpy as np
np.mean(list(dict.values()))

对字典的迭代会对其键进行迭代。 尝试只for key in G使用for key in G ,然后适当地使用G[key]而不是values

或者,使用字典的iteritems()方法从 G 中获取key, value对,即:

d=[float(sum(values)) / len(values) for key, values in G.iteritems()]

(为了记录,您计算均值的实际方法在我看来并不正确,但您最好先解决迭代问题)。

在 Python 3.4 以上有一个非常明确的方法:

import statistics
numbers = [G[key] for key in G]
mean_ = statistics.mean(numbers)

使用G.values()从字典中获取所有值。

G = {'E': 18.0, 'D': 17.0, 'C': 19.0, 'B': 15.0, 'A': 0}
d = float(sum(G.values())) / len(G)
print (d)

这将打印13.8

请注意,此处 Python 2 和 Python 3 之间存在差异。 在 Python 2 中, G.values()是一个新构造的值列表。 在 Python 3 中,它是一个生成器,可以被认为是一个“惰性列表”。 同样的东西在 Python 2 中称为G.itervalues()

你要:

mean = sum([G[key] for key in G])/float(len(G))

您的原始代码还将产生:

TypeError: 'int' object is not iterable

当您尝试对值求和时。

我建议采用一种可重用且灵活的函数式编程范式,而不是当前的答案。 例如,创建一个函数来计算包含在简单dict list值的任何统计信息:

def summarize_dict(dictionary, function):
        dict_new = {}
    for k,v in dictionary.items():
        dict_new[k] = function(v)
    return dict_new

测试:

import numpy as np

keys = ["a","b","c","d","e"]
values = [range(2),range(4),range(6),range(8),range(10)]
dictionary = dict(zip(keys, values))

summarize_dict(dictionary, np.mean)

产量:

{'a': 0.5, 'b': 1.5, 'c': 2.5, 'd': 3.5, 'e': 4.5}

另一个 for 循环,这个循环不需要物品的计数器。

G = {'E': 18.0, 'D': 17.0, 'C': 19.0, 'B': 15.0, 'A': 0}

sum = 0
for k in G:
    sum += float(G[k])

print "Mean: " + str(sum/len(G))

结果:

Mean: 13.8
[Finished in 0.3s]

实际上,鉴于您的数据,没有必要使用float 最后,删除float并只留下sum += G[k]仍然输出相同,因为值无论如何都不是字符串。

假设您有一个包含多个键的字典,每个键都有一个值列表:

your_averaged_dictionary = {key: np.mean(values) for key, values in your_dictionary}
  相关解决方案