如何在Python中为高分表排序这些行

时间:2012-04-26 19:38:34

标签: python

我在文本文件中有以下内容:

('bob', '10')
('Ben', '10')
('Ben', '9')
('Ben', '8')
('Ben', '2')
('Ben', '6')
('Ben', '5')
('Ben', '5')
('Ben', '3')
('Ben', '2')

我想重新排序,以便按照数字排序,这样我就可以在高分表中打印出来,但是我无法理解如何做到这一点。任何帮助将不胜感激,谢谢。

3 个答案:

答案 0 :(得分:7)

您可以使用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]))),

答案 1 :(得分:1)

如果l是元组列表,则以下将进行排序:

sorted(l, key=lambda(name,score):int(score), reverse=True)

阅读文件留给读者练习:)

答案 2 :(得分:0)

如果你甚至怀疑你的高分榜在未来的某个时候会变得更复杂,你可能应该停止使用元组列表,而是使用一组特制的类实例。

无论如何,如果你坚持使用元组,只需将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)