如何使用字符串和数字对列表进行排序(外部文本文件)

时间:2018-12-18 13:03:03

标签: python text

因此,我尝试使用this问题中的代码,它可以工作,但是我正在将文本文件导入列表,但似乎没有对它进行排序。

这是我的代码:

import re
key_pat = re.compile(r"^(\D+)(\d+)$")
def key(item):
    m = key_pat.match(item)
    return m.group(1), int(m.group(2))

data=[line.strip() for line in open('DieGameScores.txt')]

data.sort( key=key )
print(data)

结果如下:

['tr35', 'nk32', 'ms49', 'mg41', 'jw40', 'jo13']

但是我希望它输出:

['ms49', 'mg41', 'jw40', 'tr35', 'nk32', 'jo13']

有人知道如何解决此问题吗?

5 个答案:

答案 0 :(得分:3)

如果您需要按int排序的列表,这是一种方法

例如:

l = ['tr35', 'nk32', 'ms49', 'mg41', 'jw40', 'jo13']
print(sorted(l, key=lambda x: int("".join(i for i in x if i.isdigit())), reverse=True))

输出:

['ms49', 'mg41', 'jw40', 'tr35', 'nk32', 'jo13']

答案 1 :(得分:1)

如果要先按数字排序,然后按字符串部分排序-您需要反转键函数中的返回值-

return int(m.group(2)), m.group(1) 

然后,由于您希望按降序排列-您需要指定相反的参数

data.sort(key=key, reverse=True)

答案 2 :(得分:0)

您的脚本,在线

data.sort(key = key)

将您在名称键下定义的函数作为某种排序标准调用。但是,这不是您的关键职能的角色。

话虽如此,稍加修改即可解决问题。首先介绍:

def my_criteria(a):
    return int(a[-2:])

然后调用几乎像您一样进行排序:

data.sort(key=my_criteria, reverse=True)

这一次,您所使用的键将重点放在字符串末尾的int作为排序标准,并使用reverse = True参数获得了您似乎一直在尝试获得的东西。

答案 3 :(得分:0)

您可以做类似

的操作
  

注意-假设您的最后两个字符是所有元素的数字

l = ['tr35', 'nk32', 'jw40', 'jo13', 'ms49', 'mg41']

sl = sorted(l, key=lambda x: x[2:], reverse=True)

print(sl)

输出

['ms49', 'mg41', 'jw40', 'tr35', 'nk32', 'jo13']

答案 4 :(得分:0)

只需从键输出中删除第一组,因此您的代码将如下所示:

import re
key_pat = re.compile(r"^(\D+)(\d+)$")


def key(item):
    m = key_pat.match(item)
    return int(m.group(2))

data = [line.strip() for line in open('DieGameScores.txt')]

data.sort(key=key, reverse=True)
print(data)

输出:

['ms49', 'mg41', 'jw40', 'tr35', 'nk32', 'jo13']