繁体   English   中英

如何在Python中从文本文件对数据进行最高到最低排序?

[英]How do I sort data highest to lowest in Python from a text file?

我已经尝试了多种方法来执行此操作,但似乎都没有用。答案按字母顺序出现

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

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

还有什么方法可以消除掉到外壳程序中的“ / n”?

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

要按年级数字排序:

>>> 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']]

这些行是未排序的。

下一步是对行进行排序。 这可以通过对key选项进行sorted来完成:

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

lambda x: int(x[1])接受列表的第二个元素x[1]并将其转换为整数。 换句话说, sorted等级的整数值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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM