我的文本文件布局为:
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
我现在需要按降序对这些数字进行排序。我已经尝试了许多方法,例如读取行和使用反向函数,但是我\
在运行它时得到了很多?
而不是立即写出数据,而是将数据作为元组附加到列表中,然后对该列表进行排序。然后写出数据。
重新实现您的阅读循环以创建该列表:
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()
and line.split(' ')
,而是使用了0参数str.split()
版本,该版本包括一个带区并在任意宽度的空白处分割;这简化了每行的处理。
使用sorted()
函数完成排序; 设置会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')]
如果要对已经生成的输出文件进行排序,则必须再次读取它,分割每一行,将第一个元素转换为整数,然后应用相同的排序并随后写入循环。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句