首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在值列表中查找平均值

在值列表中查找平均值
EN

Stack Overflow用户
提问于 2016-04-23 10:59:16
回答 4查看 493关注 0票数 0

编辑:

这不是查找列表平均值的重复,因为此列表是分配给键的值。

必须为那些没有得到它的人澄清。

我有一个字典,每个键都有一个列表/多个值:

代码语言:javascript
复制
'Jimin ': ['0', '0', '0', '0', '0', '0'], 'Jin': ['1', '0'],

我想打印出每个键的平均值,例如:

代码语言:javascript
复制
'Jimin ':[0], 'Jin': [0.5],

我已经试过了:

代码语言:javascript
复制
avgDict = {}
for k,v in StudentGrades.items():
    # v is the list of grades for student k
    avgDict[k] = sum(v)/ float(len(v))

但我得到了错误代码:

代码语言:javascript
复制
TypeError: unsupported operand type(s) for +: 'int' and 'str'

我也试过:

代码语言:javascript
复制
for names, scores in class1.items():
    print("{} : {}".format(names, mean(scores))

但我得到了错误代码:

代码语言:javascript
复制
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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-04-23 11:52:58

另一种方法是定义您的avg函数,并在构建新字典时调用它,并理解字典,方法如下:

代码语言:javascript
复制
>>> 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,这就是为什么您在这个解决方案上看到的原因:map(float, lst),它将列表中的每个元素从string转换为float

EDIT2:

如果您只想打印平均值,那么以下内容就可以了:

代码语言:javascript
复制
>>> for k,v in d.items():
        print('{0} : {1}'.format(k,avg(v)))


Jin : 0.5
Jimin : 0.0
票数 0
EN

Stack Overflow用户

发布于 2016-04-23 11:06:45

代码语言:javascript
复制
>>> 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}

但如果你需要一份清单中的平均值:

代码语言:javascript
复制
>>> 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))

代码语言:javascript
复制
>>> 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
EN

Stack Overflow用户

发布于 2016-04-23 11:59:08

第一种方法不起作用的原因是,您将成绩保存为字符串列表。使代码工作的一种方法是在使用int函数将字符串添加到字典之前将字符串转换为数字。

所以这个代码

代码语言:javascript
复制
        if class1.get(names):
            class1[names].append(scores)
        else:
            class1[names] = list(scores)

会变成这样:

代码语言:javascript
复制
        if class1.get(names):
            class1[names].append(int(scores))
        else:
            class1[names] = list(int(scores))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36809909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档