如何从文本文件中将Python中的数据从最高到最低排序?

时间:2015-10-07 18:46:05

标签: python shell sorting text-files python-3.3

我尝试过多种方法,但似乎没有一种方法可行 答案按字母顺序排列

f=open("class2.txt", "r")
scores=myfile.readlines()
print(sorted(scores))
f.close()

['Anne,   3\n', 'Dave,   10', 'Jack,   4\n', 'Lucy,   8\n']

当它进入shell时还有什么方法可以摆脱“/ n”吗?

2 个答案:

答案 0 :(得分:3)

根据输入和输出,我猜你正在尝试按相关值对输入名称进行排序。要以数字方式排序,您可以解析所有值对,或使用key函数与sorted为您执行此操作(不将结果存储在任何位置)。例如:

# This could be a lambda function, but I'm splitting it out for clarity
def getlinevalue(line):
    intpart = line.split()[-1]  # Get the last whitespace separated group (assumed to be legal integer)
    return int(intpart)  # Convert to int, which will sort numerically

with open("classt2.txt") as f:
    stripnewlines = (line.rstrip() for line in f)
    # reverse=True needed to sort highest to lowest; natural sort for int is lowest to highest
    print(sorted(stripnewlines, reverse=True, key=getlinevalue))
    # If the goal is to print one pair per line, replace the print above with:
    for x in sorted(stripnewlines, reverse=True, key=getlinevalue):
        print(x)
    # Or as a one liner (require Py3, or from __future__ import print_function on Py2):
    print(*sorted(stripnewlines, reverse=True, key=getlinevalue), sep="\n")

print(sorted(stripnewlines, reverse=True, key=getlinevalue))的输出将是(以一些空格为模;截图使得很难判断逗号后面有多少空白,所以我只使用一个空格):

['Dave, 10', 'Lucy, 8', 'Jack, 4', 'Anne, 3']

这就是你想要的。

评论中要求的代码说明:

  1. getlinevalue中,我们将空格上提供的字符串拆分(str.split在没有给出参数的情况下执行此操作),然后使用[-1]从分割中获取最后一个值(索引)负数从头开始)。因此'Dave, 10'之类的内容存储在intpart '10'。然后我们将字符串'10'转换为带int()的整数值,并将其返回
  2. with open("classt2.txt") as f:打开要读取的文件,并将结果分配给f;当缩进with block完成时,文件将为您关闭(即使由于异常而退出或从函数返回)
  3. stripnewlines = (line.rstrip() for line in f)创建一个generator expression(有点像懒惰的评估list comprehension,只能迭代一次),一次读取一行并使用str.rstrip()删除所有尾随空格(例如新行;您可以使用str.rstrip("\r\n")仅删除换行符,而不是尾随制表符或空格,但需要调整key函数。我们可以使用列表推导而不是生成器表达式,但是因为sorted无论如何都会为我们创建list,所以我们懒得避免同时存储已排序和未排序的列表(或者,列表理解之后可以对结果进行.sort(...)调用,这也可以避免在内存中保留两个列表,但是.sort(...)不返回任何内容,所以我们有更多的行代码)。
  4. sorted(stripnewlines, reverse=True, key=getlinevalue)就像您在尝试中使用的sorted一样,除了根据在其上调用rstrip的结果对每个(getlinevalue - ed)行进行排序(每个值只调用一次key函数,这就是key优于cmp的原因; cmp必须在每个值log(n)期间转换n log(n)次平均排序,或总共key次转化; n转换每个值一次,并执行总共'Dave, 10'次转化)。因此,通过将调用'Anne, 3'getlinevalue('Dave, 10'))与10getlinevalue('Anne, 3'))的结果进行比较,它会3相对于3进行排序。由于数字通常按升序排列(从最低到最高)(所以10会在reverse=True之前排序)并且您想要降序(从最高到最低),我们也会通过*来反转“自然的“整数排序。”
  5. 最终的单行使用“splat”运算符(sorted)将print调用产生的列表转换为sequential positional argumentsprint;对于Python 3的print function(或者你在Python 2中使用from __future__ import print_function获得的print函数替换Py2的正常sep语句,每个参数都打印出来,' '在每个参数之间打印(默认为单个空格,end),并且在打印所有参数时,使用值"\n"跟随它(默认为新行,{{1} }})。因此,您可以在单独的输出行上从最高到最低打印输入行,而不是在一行上打印已排序列表的表示。

答案 1 :(得分:0)

按等级按数字排序:

>>> sorted((line.split() for line in open('classt2.txt')), key=lambda x: int(x[1]))
[['Anne,', '3'], ['Jack,', '4'], ['Lucy,', '8'], ['Dave,', '10']]

如何运作

以上代码分为两部分。第一个读取文件并拆分行:

>>> [line.split() for line in open('class')]
[['Anne,', '3'], ['Dave,', '10'], ['Jack,', '4'], ['Lucy,', '8']]

这些行未分类。

下一步是对线进行排序。使用sorted选项key完成此操作:

sorted(..., key=lambda x: int(x[1]))

密钥lambda x: int(x[1])获取列表的第二个元素x[1],并将其转换为整数。换句话说,sorted按等级的整数值排序。

按降序排序

以上按升序排序。要按降序排序,我们可以添加reverse=True选项:

>>> sorted((line.split() for line in open('classt2.txt')), key=lambda x: int(x[1]), reverse=True)
[['Dave,', '10'], ['Lucy,', '8'], ['Jack,', '4'], ['Anne,', '3']]

在保留原始空白的同时进行排序

按升序排序成绩:

>>> sorted(open('classt2.txt'), key=lambda x: int(x.split()[1]))
['Anne,   3\n', 'Jack,   4\n', 'Lucy,   8\n', 'Dave,  10\n']

很好地打印出来:

>>> print(''.join(sorted(open('classt2.txt'), key=lambda x: int(x.split()[1]))))
Anne,   3
Jack,   4
Lucy,   8
Dave,  10