如何在 python 中按降序对这个文本文件进行排序?

How to sort this text file in descending order in python?

我的文本文件布局为:

Richard 3 1 5
Jeff 3 7 4
Arnold 2 1 9

我通过使用以下代码分离出这些分数中的最高分并重写它:

with open ('class1.txt', 'r') as f, open("class11.txt", 'w') as fout:
      lines = [line.strip() for line in f]
      for line in lines:
           splitted = [i for i in line.split(' ') if i]
           nums = splitted[1:]
           max_nums = max(map(int, nums))
           name = splitted[0]
           fout.write(str(max_nums) + (' ') + (name) + ('\n'))
           print (splitted)

上面的代码现在交换了两列,例如最大的数字排在第一位

9 Arnold

我现在需要按降序对这些数字进行排序。我尝试了很多方法,例如阅读行和使用反向函数,但是当我 运行 it?

时,我得到了很多 \

与其立即写出数据,不如将数据作为元组附加到列表中,然后对该列表进行排序。 然后写出数据。

重新实现您的阅读循环以创建该列表:

entries = []
with open ('class1.txt', 'r') as f:
    for line in f:
        row = line.split()
        if not row:
            continue
        name = row[0]
        max_score = max(map(int, row[1:]))
        entries.append((max_score, name))

with open("class11.txt", 'w') as fout:
    for max_score, name in sorted(entries, reverse=True):
        fout.write('{} {}\n'.format(max_score, name)

我没有使用 line.strip()line.split(' '),而是使用了 0 参数 str.split() 版本,其中包含一个条带并在 任意宽度 空格;这简化了每行处理。

使用 sorted() function 进行排序;设置 reverse=True 反转排序顺序,因此最高分列在第一位。因为 entries 是一个元组列表,所以这些元组是按照字典顺序排序的;首先比较两个元组的第一个元素(分数),如果两个条目具有相同的分数,则第二个元素(名称)确定排序顺序。

这确实意味着得分相同的条目将按名称的字母倒序排序。如果这是一个问题,您将需要使用更复杂的排序键:

sorted(entries, key=lambda t: (-t[0], t[1]))

然后将 key 应用于每个元组以确定要排序的值;通过对负分进行正向排序,您仍然将最高分放在第一位,但在平局的情况下,名称仍按字母顺序向前排序。

排序演示以说明差异;得分为 6 的两个 "names" 开关位置:

>>> entries = [(5, 'foo'), (6, 'eggs'), (7, 'spam'), (6, 'bar')]
>>> sorted(entries, reverse=True)
[(7, 'spam'), (6, 'eggs'), (6, 'bar'), (5, 'foo')]
>>> sorted(entries, key=lambda t: (-t[0], t[1]))
[(7, 'spam'), (6, 'bar'), (6, 'eggs'), (5, 'foo')]

如果你想对已经生成的输出文件进行排序,你必须再次读入它,拆分每一行,将第一个元素转换为整数,然后应用相同的排序和写入循环。