【问题标题】:Python Sorting a file with names and scoresPython用名称和分数对文件进行排序
【发布时间】:2016-05-10 17:56:21
【问题描述】:

我目前有一些数据存储在一个文件中,其中包含人名和他们玩游戏时获得的分数。

文件中的数据如下所示:

Reece 0
John 5
Alex 2

我尝试过使用这样的东西:

with open("Scores.txt","r") as f:
    lines = sorted(f.readlines())
    print lines

但这只是按照每个名字中的第一个字母对它们进行排序。

我的输出应该是这样的:

Reece 0
Alex 2
John 5

这是一个相对简单的程序,我使用的是 Python 2.7

任何帮助都会很棒,我还可以提供有关我的程序的任何信息!

【问题讨论】:

  • 所以您需要按数字(0、2、5)对行进行排序?

标签: python file sorting readlines


【解决方案1】:

密钥会这样工作:

with open("test.txt","r") as f:
     lines = sorted(iter(f), key=lambda x: int(x.partition(" ")[-1]))
     print lines

这将节省内存,因为您只创建 1 个列表,并且您只在文件的行上迭代一次,它会非常快。

总的来说,我认为这是最快、最有效的方法。

因此,包括输出在内的全部功能如下:

with open("test.txt","r+") as f:
     lines = sorted(iter(f), key=lambda x: int(x.partition(" ")[-1]))
     f.seek(0)
     f.truncate()
     [f.write(l if l.endswith("\n") else l + "\n") for l in lines]

【讨论】:

  • 澄清一下,这段代码的作用是遍历文件中的每一行 (iter(f)) 并告诉 sorted()函数根据 lambda(匿名)函数 (lambda x: int(x.partition(" ")[-1])) 进行排序,该函数通过将每行的分数从行中的名称 (x.partition(" ")[-1])。这会将文件中按分数排序的行列表存储到变量 lines 中,然后在末尾打印。
  • 我不相信你在 sorted() 函数中需要 iter(f) 而是你可以只使用 f 因为 sorted() 函数接受一个可迭代对象作为第一个参数,文件 (f) 就是它。
  • @Mark 你是对的,我使用iter() 只是为了澄清,它根本不会产生任何开销,这真的取决于偏好。
【解决方案2】:

cmp参数添加到sorted的调用中:

with open("test.txt","r") as f:
     comparator = (lambda x,y: cmp(int(x.split(' ')[-1]), int(y.split(' ')[-1])))
     lines = sorted(f.readlines(), cmp=comparator)
     print lines

【讨论】:

  • 现在什么都没有排序
猜你喜欢
  • 2014-03-23
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 2011-07-12
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多