我尝试过多种方法,但似乎没有一种方法可行 答案按字母顺序排列
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”吗?
答案 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']
这就是你想要的。
评论中要求的代码说明:
getlinevalue
中,我们将空格上提供的字符串拆分(str.split
在没有给出参数的情况下执行此操作),然后使用[-1]
从分割中获取最后一个值(索引)负数从头开始)。因此'Dave, 10'
之类的内容存储在intpart
'10'
。然后我们将字符串'10'
转换为带int()
的整数值,并将其返回with open("classt2.txt") as f:
打开要读取的文件,并将结果分配给f
;当缩进with
block完成时,文件将为您关闭(即使由于异常而退出或从函数返回)stripnewlines = (line.rstrip() for line in f)
创建一个generator expression(有点像懒惰的评估list comprehension,只能迭代一次),一次读取一行并使用str.rstrip()
删除所有尾随空格(例如新行;您可以使用str.rstrip("\r\n")
仅删除换行符,而不是尾随制表符或空格,但需要调整key
函数。我们可以使用列表推导而不是生成器表达式,但是因为sorted
无论如何都会为我们创建list
,所以我们懒得避免同时存储已排序和未排序的列表(或者,列表理解之后可以对结果进行.sort(...)
调用,这也可以避免在内存中保留两个列表,但是.sort(...)
不返回任何内容,所以我们有更多的行代码)。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')
)与10
(getlinevalue('Anne, 3')
)的结果进行比较,它会3
相对于3
进行排序。由于数字通常按升序排列(从最低到最高)(所以10
会在reverse=True
之前排序)并且您想要降序(从最高到最低),我们也会通过*
来反转“自然的“整数排序。”sorted
)将print
调用产生的列表转换为sequential positional arguments到print
;对于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