csv 如何正确地将平均值从最低到最高排序?

jhkqcmku  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(83)

这是我的代码:

def calculate_three_worst(input_file_name, output_file_name): #Task4
    with open(input_file_name, 'r') as input_file:
        reader = csv.reader(input_file)
        data = list(reader)
    
    averages = []
    for row in data:
        name = row[0]
        grades = [float(grade) for grade in row[1:]]
        average = mean(grades)
        averages.append(str(average))
    
    sorted_averages = sorted(averages, key=lambda x: x[1])
    bottom_three = sorted_averages[:3]

    with open(output_file_name, 'w') as output_file:
        writer = csv.writer(output_file)
        writer.writerows(bottom_three)

calculate_three_worst("C:\\Users\\Tandis\\Desktop\\hh.CSV", "C:\\Users\\Tandis\\Desktop\\tester.txt")

我打开的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
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
Ala,0,16,16,13,19,2,17,8

我的代码的输出是:

7,.,5

6,.,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6

9,.,7,5

但一定是这样的

5.0
6.066666666666666
7.5

我该怎么办?我想把三个最差的平均值从最低到最高排序。在这种情况下,它必须如图所示,但它不是。请不要完全更改我的代码。我想知道如何通过修复代码而不是更改代码来解决这个问题。

5ktev3wc

5ktev3wc1#

对于如此琐碎的事情,您并不需要csv模块。
只需分别以'r'和'w'模式打开输入和输出文件。通过阅读每一行并以逗号分隔来解析输入文件。
在处理每一行时计算平均值,并将它们附加到列表中。
对列表进行排序,并将3个最低值输出到输出文件:

INFILE = '/Volumes/G-Drive/hh.csv'
OUTFILE = '/Volumes/G-Drive/hh_out.csv'

db = []

def calculate_three_worst(input_file_name, output_file_name):
    with open(input_file_name) as indata, open(output_file_name, 'w') as outdata:
        for line in indata:
            _, *scores = line.split(',')
            db.append(sum(float(x) for x in scores) / len(scores))
        print(*sorted(db)[:3], sep='\n', file=outdata)

calculate_three_worst(INFILE, OUTFILE)

输出文件如下所示:

5.0
6.066666666666666
7.5
axr492tv

axr492tv2#

1.如何将平均值从最低(5.0)到最高(7.5)排序?
按升序排序而不是按降序排序,后者正在发生变化

sorted_averages = sorted(averages, key=lambda x: (-x[1], x[0]))

sorted_averages = sorted(averages, key=lambda x: (x[1], x[0]))

甚至更短

sorted_averages = sorted(averages, key=lambda x: x[1])
# (Python does sort ascendingly by default)

;和变化

bottom_three = sorted_averages[-3:]

bottom_three = sorted_averages[:3]

1.我如何删除这些名字?
只需要删除此行中的name

averages.append((name, average))

即:

averages.append(average)

在那里,您有一个仅包含average的列表
1.如何删除输出之间的多余行?
我不知道您在这里发布的代码和您实际运行的代码是否相同,但我对csv.writer.writerows的尝试没有打印出额外的行。
总结一下:你必须按照我的建议修改代码中的几个部分。它们并不太复杂。快乐的Python。

相关问题