我需要对字符串列表进行排序,其中包含字符串开头和结尾的数字,第一个按开头数字,然后表示结束数字。因此,起始数字优先于结束数字。
例如:
l = ['900abc5', '3000abc10', '1000abc5', '1000abc10', '900abc20']
会变成:
l = ['900abc5', '900abc20','1000abc5','1000abc10','3000abc10']
我知道l.sort()在这里不起作用,因为它按字典顺序排序。我尝试的任何其他方法似乎都过于复杂(例如:通过匹配起始数字来拆分字符串,然后通过结束数字再次拆分,排序,连接,然后重新组合列表)甚至总结该方法表明它效率不高!
编辑:在玩了natsort模块后,我发现natsorted(l)解决了我的特殊问题。
答案 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