[英]How can I use a dictionary to sort results from a text file alphabetically, by average and by highest to lowest?
[英]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”?
基于输入和输出,我猜您正在尝试按关联值对输入名称进行排序。 要进行数字排序,您可以解析所有值对,也可以使用已sorted
的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']
这就是您似乎想要的。
注释中要求的代码说明:
getlinevalue
,我们将在getlinevalue
拆分提供的字符串(在未提供参数的情况下str.split
执行此操作),然后使用[-1]
从拆分中获取最后一个值(从负数开始索引)。 因此,像'Dave, 10'
被存储到intpart
为'10'
。 然后,我们使用int()
将字符串'10'
转换为其整数值并返回 with open("classt2.txt") as f:
打开文件进行读取,并将结果分配给f
; 当缩进with
块结束时,将为您关闭文件(即使该块由于异常或从函数返回而退出) stripnewlines = (line.rstrip() for line in f)
创建一个生成器表达式 (类似于懒惰求值的列表理解 ,只能迭代一次),该表达式一次读取一行并使用str.rstrip()
删除所有尾随空格(例如,换行;您可以使用str.rstrip("\\r\\n")
仅删除换行,而不删除尾部制表符或空格,但需要调整key
功能)。 我们可以使用列表推导而不是生成器表达式,但是由于sorted
无论如何都会为我们创建list
,因此我们很懒于避免同时存储已排序和未排序的列表(或者,可以将列表推导然后对结果进行.sort(...)
调用,这还可以避免在内存中保留两个列表,但是.sort(...)
不返回任何内容,因此我们会有更多的代码行)。 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
来反转整数的“自然”排序。 *
)将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.