编辑:
这不是查找列表的平均值的副本,因为此列表是分配给键的值。
不得不为那些没有得到它的人清楚。
我有一个字典,其中每个键都有一个列表/多个值:
'Jimin ': ['0', '0', '0', '0', '0', '0'], 'Jin': ['1', '0'],
我想打印出每个键的平均值,例如:
'Jimin ':[0], 'Jin': [0.5],
我已经尝试过了:
avgDict = {}
for k,v in StudentGrades.items():
# v is the list of grades for student k
avgDict[k] = sum(v)/ float(len(v))
但是我得到了错误代码:
TypeError: unsupported operand type(s) for +: 'int' and 'str'
我也尝试过:
for names, scores in class1.items():
print("{} : {}".format(names, mean(scores))
但是我得到了错误代码:
Traceback (most recent call last):
File "C:/Users/Onyeka/Documents/Onyeka/Computer Science/Controlled ` Assessment/Programming Project/task3.py", line 68, in <module>`
print("{} : {}".format(names, mean(scores)))
File "C:\Python34\lib\statistics.py", line 331, in mean
T, total, count = _sum(data)
File "C:\Python34\lib\statistics.py", line 161, in _sum
for n,d in map(_exact_ratio, values):
File "C:\Python34\lib\statistics.py", line 247, in _exact_ratio
raise TypeError(msg.format(type(x).__name__))
TypeError: can't convert type 'str' to numerator/denominator
答案 0 :(得分:1)
>>> x = {'Jimin ': ['0', '0', '0', '0', '0', '0'], 'Jin': ['1', '0']}
>>> {k: sum(int(i) for i in v) / float(len(v)) for k, v in x.items()}
{'Jimin ': 0.0, 'Jin': 0.5}
但如果您需要列表中的平均值:
>>> x = {'Jimin ': ['0', '0', '0', '0', '0', '0'], 'Jin': ['1', '0']}
>>> {k: [sum(int(i) for i in v) / float(len(v))] for k, v in x.items()}
{'Jimin ': [0.0], 'Jin': [0.5]}
或者,您可以直接转换为float
,然后您不需要float(len(v))
:
>>> x = {'Jimin ': ['0', '0', '0', '0', '0', '0'], 'Jin': ['1', '0']}
>>> {k: [sum(float(i) for i in v) / len(v)] for k, v in x.items()}
{'Jimin ': [0.0], 'Jin': [0.5]}
答案 1 :(得分:0)
另一种方法是定义你的avg
函数,并在使用字典理解构建新字典期间调用它,这样:
>>> d = {'Jimin': ['0', '0', '0', '0', '0', '0'], 'Jin': ['1', '0']}
>>>
>>> def avg(lst):
return sum(map(float,lst))/len(lst)
>>> {k:avg(v) for k,v in d.items()}
{'Jin': 0.5, 'Jimin': 0.0}
编辑:
你在那里得到的错误消息是由于你的列表值中的项目是string
,所以你需要在进行算术运算之前输入它们int
,&#39;为什么你看到这个解决方案:map(float, lst)
,它将列表中的每个元素从string
转换为float
。
EDIT2:
如果您只想打印平均值,那么以下内容将会执行:
>>> for k,v in d.items():
print('{0} : {1}'.format(k,avg(v)))
Jin : 0.5
Jimin : 0.0
答案 2 :(得分:0)
您的第一种方法不起作用的原因是,您将成绩保存为字符串列表。使代码工作的一种方法是在使用int
函数将字符串添加到字典之前将字符串转换为数字。
所以这段代码
if class1.get(names):
class1[names].append(scores)
else:
class1[names] = list(scores)
会变成这样:
if class1.get(names):
class1[names].append(int(scores))
else:
class1[names] = list(int(scores))
答案 3 :(得分:0)
您可以使用统计模块的mean()方法:
<强>代码:强>
from statistics import mean
A = {'Jimin': [1,2,3], 'Jin': [1,2,3]}
for key in A.keys():
A[key] = mean(A.get(key))
这会产生:
A = {'Jimin': 2.0, 'Jin': 2.0}