Python:根据新变量按顺序从文本文件中排序数据

2024-10-01 04:46:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文本文件,它以以下格式存储数据:

Mike 6 4 3
Terry 4 3 4
Paul 10 7 8

jvecsei昨天帮助我用一些代码检索数据并确定每个人的最高分数。我稍微修改了一下,这样它就可以选择分数并打印出每个人的平均值。在

^{pr2}$

它的输出是这样的,非常好:

Mike : 4
Terry : 3
Paul : 8

问题:我真的很想把这三个人按得分最高的顺序排序,这样他们就可以把得分最高的人排在最前面,而得分最低的人排在最后,如下所示:

Paul : 8
Mike : 4
Terry : 3

我过去曾用它从文本文件中检索并按字母顺序排序,但由于平均值是一个新变量,并且没有与原始数字一起存储在文本文件中,所以我不知道如何引用/实现它。在

with open('classc.txt', 'r') as r:
    for line in sorted(r):
        print(line, end='')

非常感谢你的帮助。我慢慢地对这些东西越来越熟悉了,但我还有很长的路要走。在


Tags: 数据代码排序顺序格式字母line分数
3条回答

你可以写一个函数来计算分数的平均值,然后根据它进行排序。请注意,您的函数将进行计算,而average实际上并不需要“存储”在原始文件/数据中的任何位置-

def mysort(line):
    score1, score2, score3 = map(int, line.split()[1:])
    average = (score1 + score2 + score3) / 3
    return -1*average, line.split()[0]

with open("score-sheet.txt", "r") as f:
    text = f.readlines()
    for line in sorted(text, key=mysort):
        print line

我用这个问题来说明python3.5中一些不错的新特性。您可以使用new statistics modulegeneralized unpacking以一种非常python的方式来解决这个问题:

>>> from statistics import mean # Cool new module!

>>> lines =(l.split() for l in open ("classa.txt")) #  Generator consuming the file
# Now split the list by unpacking into name, *scores
>>> persons = ((mean(int(x) for x in scores), name) for name, *scores in lines)
>>> for score in sorted(persons,  reverse=True): #  Some boring I/O
       print("{} : {}".format (score[1], int(score[0])))
>>>
Paul : 8
Mike : 4
Terry : 3 #  Terry really needs to step up his game

以下是更传统的python代码:

^{pr2}$

将您的Name : Average输出存储到字典中,然后使用^{}对字典进行排序

d = {}
with open ("file.txt") as f:
    content = f.read().splitlines()
    for line in content:
        splitline = line.split(" ")
        name = splitline[0]
        score = splitline[1:]
        total = int(splitline[-1]) + int(splitline[-2]) + int(splitline[-3])
        average = int(total/3)
        print("{} : {}".format (name, average))
        d[name] = average

sorted_d = sorted(d.items(), key=operator.itemgetter(1), reverse= True)

for i in sorted_d:
    print '{} : {}'.format(*i)

输出:

^{pr2}$

相关问题 更多 >