import operatorfo = open('3a.txt','r')x = fo.readlines()sorted_x = sorted(x,key=operator.itemgetter(0),reverse = True)print(sorted_x)
我的文本文件如下所示:
5 Helen 4 judy8 Rachel
我想知道我如何能够将operator.itemgetter(0)与双数字一起使用?
当我使用它时:
5 Helen 4 judy25 Hanna11 Elsa8 Rachel
结果都错了:
['8 Rachel','5 Helen','4 judy','25 Hanna','11 Elsa']
即使我使用operator.itemgetter(0,1).
解决方法 你的operator.itemgetter(0)方法只能让你到目前为止;它会永远选择你的第一个字符.要以数字方式对文件进行正确排序,您的关键功能必须执行以下 *** 作:
>正确地将线路起点处的数字与其余部分分开.
>将表示数字的字符串转换为适当的整数值.
后者很重要,因为排序字符串是按字典顺序完成的;例如’10’在’9’之前排序,因为1在9之前排序.
要在行的开头支持任意数字字符运行(由空格分隔),您需要在空格上拆分.如果您没有给出任何参数或者对第一个参数使用None,则str.split()
method可以为您执行此 *** 作.为了保持高效,将分割数限制为1,并将结果的第一个元素转换为整数:
fo = open('3a.txt','r')x = fo.readlines()sort_key = lambda line: int(line.split(None,1)[0])sorted_x = sorted(x,key=sort_key,reverse=True)print(sorted_x)
因此,关键参数是一个匿名函数(一个lambda),该函数接受一个参数,该行被排序.该行仅在空格上拆分一次(line.split(None,1),并将该拆分的第一个元素转换为整数:
>>> '11 Hello World'.split(None,1)['11','Hello World']>>> '11 Hello World'.split(None,1)[0]'11'>>> int('11 Hello World'.split(None,1)[0])11
您也可以改进其余的实施;由于文件是可迭代的,因此无需调用file.readlines(). sorted()将把一切都放在一个可迭代的并排序,所以你可以直接将整个文件对象传递给函数.
您还希望处理文件,以便在完成后自动关闭它们.利用他们是上下文管理者的事实;当上下文“完成”(已结束)并且文件对象将自动关闭时,with语句将向它们发出信号:
sort_key = lambda line: int(line.split(None,1)[0])with open('3a.txt','r') as fo: sorted_x = sorted(fo,reverse=True)print(sorted_x)
演示:
>>> from io import StringIO>>> fo = StringIO('''\... 5 Helen ... 4 judy... 25 Hanna... 11 Elsa... 8 Rachel... '''... )>>> sort_key = lambda line: int(line.split(None,1)[0])>>> sorted(fo,reverse=True)['25 Hanna\n','11 Elsa\n','8 Rachel\n','5 Helen \n','4 judy\n']
只有当你第一次将你的行分成列表时,你才能完成这个并仍然使用operator.itemgetter(0),其中元素0是一个整数:
import operatorsort_key = operator.itemgetter(0)with open('3a.txt','r') as fo: split_lines = (line.split(None,1) for line in fo) numeric_lines = ((int(line[0]),line[1]) for line in split_lines) sorted_x = sorted(numeric_lines,reverse=True)print(sorted_x)
这使用生成器表达式来处理读取时的行.但是现在你有一个列表,每个元素都有一个元组,一个整数和你的其余部分:
>>> import operator>>> fo = StringIO('''\... 5 Helen ... 4 judy... 25 Hanna... 11 Elsa... 8 Rachel... ''')>>> sort_key = operator.itemgetter(0)>>> split_lines = (line.split(None,1) for line in fo)>>> numeric_lines = ((int(line[0]),line[1]) for line in split_lines)>>> sorted(numeric_lines,reverse=True)[(25,'Hanna\n'),(11,'Elsa\n'),(8,'Rachel\n'),(5,'Helen \n'),(4,'judy\n')]总结
以上是内存溢出为你收集整理的python-3.x – 从文本文件开始的Python降序全部内容,希望文章能够帮你解决python-3.x – 从文本文件开始的Python降序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)