问题描述
我有一本字典,看起来像:
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
有人可以帮我解决这个问题吗????
1楼
如果您使用 numpy:
import numpy as np
np.array(list(dict.values())).mean()
2楼
要使用“简单的 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
3楼
import numpy as np
np.mean(list(dict.values()))
4楼
对字典的迭代会对其键进行迭代。
尝试只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()]
(为了记录,您计算均值的实际方法在我看来并不正确,但您最好先解决迭代问题)。
5楼
在 Python 3.4 以上有一个非常明确的方法:
import statistics
numbers = [G[key] for key in G]
mean_ = statistics.mean(numbers)
6楼
使用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()
。
7楼
你要:
mean = sum([G[key] for key in G])/float(len(G))
您的原始代码还将产生:
TypeError: 'int' object is not iterable
当您尝试对值求和时。
8楼
我建议采用一种可重用且灵活的函数式编程范式,而不是当前的答案。
例如,创建一个函数来计算包含在简单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}
9楼
另一个 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]
仍然输出相同,因为值无论如何都不是字符串。
10楼
假设您有一个包含多个键的字典,每个键都有一个值列表:
your_averaged_dictionary = {key: np.mean(values) for key, values in your_dictionary}