【发布时间】:2020-12-06 16:43:53
【问题描述】:
以下函数从 CSV 文件中读取每个人的姓名以及他们的平均成绩。如果成绩不重复,则按升序显示;否则,它会按字母顺序对其进行排序和显示。
例子:
hossein: 16
linda: 7.5
mandana: 7.5
####################################
csv 文件:
mandana,5,7,3,15
hamid,3,9,4,20,9,1,8,16,0,5,2,4,7,2,1
sina,19,10,19,6,8,14,3
linda,5,7,3,15
sara,0,5,20,14
soheila,13,2,5,1,3,10,12,4,13,17,7,7
ali,1,9
sarvin,0,16,16,13,19,2,17,8
ahmad,1,9
我的代码:
from statistics import mean
import csv
import operator
def sss():
with open('alaki.csv','r') as s:
sp = csv.reader(s)
res = {}
for lines in sp:
name = lines[0]
ssd = mean([float(l) for l in lines[1:]])
res[name] = ssd
m = len(res.values())
m2 = len(set(res.values()))
if m == m2:
soe = dict(sorted(res.items() , key=operator.itemgetter(1)))
for i,v in soe.items():
print(i,v)
else:
soes = dict(sorted(res.items() , key=lambda x: (x[0], -x[1])))
for s,d in soes.items():
print(s,d)
sss()
正确的输出:
ahmad,5.0
ali,5.0
hamid,6.066666666666666
linda, 7.5
mandana, 7.5
soheila,7.833333333333333
sara,9.75
sina,11.285714285714286
sarvin,11.375
请帮我写程序,让它的输出和上面的输出一样
【问题讨论】:
-
我不确定我是否理解您的问题所在。我运行了它,它似乎按顺序列出了平均值。你能提供你的预期输出和错误或你得到什么吗?
-
使用
key=lambda x: (-x[1], x[0])。无论是否有重复的分数,这都会给出所需的输出。 -
我编辑了我的问题,请阅读它,我很乐意帮助我
-
如果你不使用字典并简单地对
(average, name)形式的元组进行排序会更容易,它们自然会按值排序,然后按名称排序。您可以使用以下方式创建元组列表:tuples_list = ((mean(map(float,grades)),name) for name,*grades in csv.reader(open("alaki.csv","rt")))