加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python-3.x – 从文本文件开始的Python降序

发布时间:2020-12-20 12:07:37 所属栏目:Python 来源:网络整理
导读:目前我按照这样的降序排序我的文本文件: 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 我想知道我如何能够将
目前我按照这样的降序排序我的文本文件:

import operator
fo = open('3a.txt','r')
x = fo.readlines()
sorted_x = sorted(x,key=operator.itemgetter(0),reverse = True)
print(sorted_x)

我的文本文件如下所示:

5 Helen 
4 judy
8 Rachel

我想知道我如何能够将operator.itemgetter(0)与双数字一起使用?

当我使用它时:

5 Helen 
4 judy
25 Hanna
11 Elsa
8 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 Hannan','11 Elsan','8 Racheln','5 Helen n','4 judyn']

只有当你第一次将你的行分成列表时,你才能完成这个并仍然使用operator.itemgetter(0),其中元素0是一个整数:

import operator

sort_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,'Hannan'),(11,'Elsan'),(8,'Racheln'),(5,'Helen n'),(4,'judyn')]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读