我的文本文件如下:
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
我现在需要按降序对这些数字进行排序。我尝试了很多方法,例如阅读线条和使用反转功能,但是当我运行它时我得到了很多\
?
答案 0 :(得分:2)
不是立即写出数据,而是将数据作为元组附加到列表中,然后对该列表进行排序。 然后写出数据。
重新实现您的阅读循环以创建该列表:
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-argument str.split()
版本,其中包含一个条带并在任意宽度空格上拆分;这简化了每行处理。
使用sorted()
function完成排序;设置reverse=True
会撤消排序顺序,以便首先列出最高分。因为entries
是元组列表,所以这些元组按字典顺序排序;首先将第一个元素(分数)比较两个元组,如果两个条目具有相同的分数,则第二个元素(名称)确定排序顺序。
这确实意味着具有相同分数的条目然后以反向字母顺序对名称进行排序。如果这是一个问题,您将需要使用更复杂的排序键:
sorted(entries, key=lambda t: (-t[0], t[1]))
然后将key
应用于每个元组以确定要排序的值;通过在负分数上排序前进,您仍然可以获得最高分,但如果领带名称仍按正向字母顺序排序。
排序演示来说明差异;分数为6的两个“名字”开关位置:
>>> 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')]
如果要对已经生成的输出文件进行排序,则必须再次读取它,拆分每一行,将第一个元素转换为整数,然后应用相同的排序和写入循环。