【问题标题】:How can I read duplicate grades from csv and then sort by grade point average and each person's name? [duplicate]如何从 csv 读取重复的成绩,然后按平均成绩和每个人的姓名排序? [复制]
【发布时间】: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")))

标签: python algorithm math


【解决方案1】:

您对问题的描述和您的代码表明您希望根据是否存在重复分数进行不同的排序,但根据您的示例输出,您似乎只想以相同的方式对 grade, name 元组进行排序案例:

from statistics import mean
import csv


def sss() -> None:
    with open('alaki.csv', 'r') as s:
        for grade, name in sorted(
            (mean(float(l) for l in line[1:]), line[0])
            for line in csv.reader(s)
        ):
            print(f"{name},{grade}")


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

【讨论】:

  • 你的答案都是错误的,我不想要输出。请看我在问题中说的输出。谢谢
  • 所以您只希望它们在所有情况下都按字母顺序排序?这实际上使它变得容易得多。如果您不想在这种情况下对事物进行不同的排序,为什么还要提到以不同的方式处理重复项?
  • 我向你道歉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 2019-08-25
相关资源
最近更新 更多