对包含字符串开头和结尾的数字的字符串进行排序

时间:2017-01-16 19:13:31

标签: python sorting

我需要对字符串列表进行排序,其中包含字符串开头和结尾的数字,第一个按开头数字,然后表示结束数字。因此,起始数字优先于结束数字。

例如:

    l = ['900abc5', '3000abc10', '1000abc5', '1000abc10', '900abc20']

会变成:

    l = ['900abc5', '900abc20','1000abc5','1000abc10','3000abc10']

我知道l.sort()在这里不起作用,因为它按字典顺序排序。我尝试的任何其他方法似乎都过于复杂(例如:通过匹配起始数字来拆分字符串,然后通过结束数字再次拆分,排序,连接,然后重新组合列表)甚至总结该方法表明它效率不高!

编辑:在玩了natsort模块后,我发现natsorted(l)解决了我的特殊问题。

3 个答案:

答案 0 :(得分:2)

您可以创建自定义函数以从字符串中提取数字,并将该函数用作sorted()的键。

例如:在下面的函数中,我使用 regex 来提取数字:

import re

def get_nums(my_str):
    return list(map(int, re.findall(r'\d+', my_str)))

有关更多替代方案,请参阅Python: Extract numbers from a string

然后使用get_nums()作为键调用已排序的函数:

>>> l = ['900abc5', '3000abc10', '1000abc5', '1000abc10', '900abc20']

>>> sorted(l, key=get_nums)
['900abc5', '900abc20', '1000abc5', '1000abc10', '3000abc10']

注意:根据您的示例,我的正则表达式假设在字符串的开头和结尾只有一个数字,字符串中包含所有中间字符作为非数字。

答案 1 :(得分:1)

这是一个带正则表达式的选项,用于查找前导数字和尾随数字,并将它们用作sorted函数中的键:

import re
sorted(l, key = lambda x: (int(re.findall("^\d+", x)[0]), int(re.findall("\d+$", x)[0])))

# ['900abc5', '900abc20', '1000abc5', '1000abc10', '3000abc10']

答案 2 :(得分:0)

Python的?- partition(1, 10, X). X = 42 ; false. 方法允许指定sorted参数,该参数应该是将列表元素转换为排序值的函数。在您的情况下,您希望按字符串中的数字排序。例如key,密钥为'900abc5',依此类推。因此,您希望传入一个[900, 5]函数,将字符串转换为数字列表。

使用正则表达式,从字符串中提取数字非常容易。您需要做的就是将数字映射到实际数字,因为正则表达式返回字符串匹配。

我相信下面的代码应该有效:

key