我在文本文件中有以下内容:
('bob', '10')
('Ben', '10')
('Ben', '9')
('Ben', '8')
('Ben', '2')
('Ben', '6')
('Ben', '5')
('Ben', '5')
('Ben', '3')
('Ben', '2')
我想重新排序它,以便按数字向下排序,以便我可以在高分表中打印它们,但是我不知道如何做到这一点。任何帮助将不胜感激,谢谢。
我在文本文件中有以下内容:
('bob', '10')
('Ben', '10')
('Ben', '9')
('Ben', '8')
('Ben', '2')
('Ben', '6')
('Ben', '5')
('Ben', '5')
('Ben', '3')
('Ben', '2')
我想重新排序它,以便按数字向下排序,以便我可以在高分表中打印它们,但是我不知道如何做到这一点。任何帮助将不胜感激,谢谢。
您可以使用ast.literal_eval
来解析元组,然后将它们传递给sorted
:
import ast
from operator import itemgetter
def parse_item(s):
name, score = ast.literal_eval(s)
return name, int(score)
with open("infile", "r") as infile:
items = [parse_item(line.strip()) for line in infile]
for item in sorted(items, key=itemgetter(1), reverse=True):
print item
或者简洁但令人困惑的方式:
print ''.join(sorted(open('infile'), key=lambda l: -int(ast.literal_eval(l)[1]))),
如果l
是元组列表,以下将进行排序:
sorted(l, key=lambda(name,score):int(score), reverse=True)
阅读文件留给读者作为练习:)
如果您甚至怀疑您的高分列表在将来的某个时候会变得更加复杂,您可能应该停止使用元组列表,而改用专门制作的类实例列表。
无论如何,如果你坚持使用元组,只需将 str 数字转换为 int,并反转元组的两个字段的顺序以获得可以排序的东西。
一个类可能看起来像:
class Highscore:
def __init__(self, name, score):
self.name = name
self.score = score
def __cmp__(self, other):
return -cmp(self.score, other.score)