【问题标题】:How to sort strings containing a number in a text file from greatest to least?如何从最大到最小对文本文件中包含数字的字符串进行排序?
【发布时间】:2018-06-11 05:38:39
【问题描述】:

我有一个看起来像这样的文本文件:

Joe Smith: 200 dollars
Marcus: 150 dollars
Sally Mae: 300 dollars

等等等等。

我想要的是让它们在列表中从大到小排序,所以:

["Sally Mae: 300 dollars", "Joe Smith: 200 dollars", "Marcus: 150 dollars"]

任何帮助将不胜感激!

【问题讨论】:

  • 显示您尝试解决的问题...
  • 如果文本包含 2 个数字怎么办

标签: python python-3.x list file sorting


【解决方案1】:

您可以使用sorted 函数和下面的lambda 函数 作为键来提取数字,然后对它们进行排序。

#                         v to only match numbers preceded with colon ':' and space
lambda x: int(re.search('(?<=:\s)\d+', x).group())
#          ^                       ^ match the pattern with continuing numbers
#          ^  type-cast the string of number to int
# `sorted` will use this returned int to sort the elements 

例如:

>>> import re
>>> my_list = ["Joe Smith32: 200 dollars", "Marcus: 150 dollars", "Sally Mae: 300 dollars"]

>>> sorted(my_list, key=lambda x: int(re.search('(?<=:\s)\d+', x).group()), reverse=True)
['Sally Mae: 300 dollars', 'Joe Smith32: 200 dollars', 'Marcus: 150 dollars']

默认情况下,sorted 按升序排序。使用reverse=True进行降序排序。

要打开文件,并以列表的形式读取内容,您只需要:

with open('/path/tofile.txt') as f:
    my_list = f.readlines()

注意:正如评论中提到的,OP 澄清说,除了需要对其进行排序的数字之外,这些数字唯一可能存在的其他地方是用户名。因此,使用这个表达式是安全的。

【讨论】:

  • 其实一个名字可以包含一个数字。它们是用户名,所以可能是 Joe Smith21 或类似的东西。谢谢你的回答!
  • @DevinGP 更新了答案以注意用户名中的数字。希望对您有所帮助!
  • 嘿,我收到错误AttributeError: 'NoneType' object has no attribute 'group' 我该如何解决这个问题?我认为您误读了您的问题,因为我不想对列表进行排序,但我想将文本文件排序为列表。没关系,我将我的文件转换为字符串:lbList = [] leaderboardListRaw = open("bank.txt", "rt") leaderboardList = leaderboardListRaw.read()leaderboardListRaw.close() for line in leaderboardList.split("\n"): lbList.append(line) 虽然我仍然收到错误,所以任何帮助修复将不胜感激,谢谢!
  • 补充:我认为这是因为某些用户名可能包含特殊字符,例如 [ ] - _ 等。我可以在正则表达式中添加什么以包含所有内容?谢谢
  • 嗨@DevinGP,你不需要所有这些来从文件中提取文本作为列表,添加示例代码来实现这一点。并且正则表达式不会由于用户名中的特殊字符而失败,只要您的字符串中包含“:200”。你可以打印列表并检查是否有任何一行是空的(我猜这是)?只要有冒号“:”后跟空格,然后是您的号码,您的正则表达式就可以工作。
【解决方案2】:

你可以简单地尝试这样的事情:

import re
pattern=r'\d+'
sort_dict=[]
with open('file.txt','r') as f:
    for line in f:
        match=re.search(pattern,line)
        sort_dict.append((int(match.group()),line.strip()))
for i in sorted(sort_dict)[::-1]:
    print(i[1])

输出:

Sally Mae: 300 dollars
Joe Smith: 200 dollars
Marcus: 150 dollars

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-15
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2018-04-02
    • 2021-07-02
    相关资源
    最近更新 更多