如何在Python中按数字对含数字的字符串列表进行正确排序?
如何按数字大小对带前缀的字符串列表排序?
你碰到的这个问题很常见——Python的sorted()函数默认是按字典序来排序字符串的,它会把每个字符逐个比较,这就导致'a-11'里的第二个字符'1'比'a-2'里的'2'小,所以排在了前面,不符合我们想要的数字大小顺序。
要实现按数字部分的数值排序,核心是给sorted()传入key参数,告诉它按照字符串里的数字值来排序,这里有几种实用的方法:
方法一:分割字符串提取数字(适用于固定格式)
如果你的字符串都是前缀-数字的固定格式,直接分割字符串提取数字部分转成整数就行:
x = ('a-34','a-1','a-0', 'a-11', 'a-2') y = sorted(x, key=lambda s: int(s.split('-')[1])) print(y) # 输出:['a-0', 'a-1', 'a-2', 'a-11', 'a-34']
这里lambda s: int(s.split('-')[1])的作用是:对每个字符串s,用'-'分割成两部分,取第二部分(也就是数字的字符串形式),再转成整数,排序时就会依据这个整数的大小来排列。
方法二:按前缀+数字排序(适用于多前缀场景)
如果你的列表里有不同前缀的字符串(比如既有'a-'也有'b-'),想要先按前缀排序,前缀相同再按数字大小排序,只需让key返回一个包含前缀和数字的元组:
x = ('b-5','a-34','a-1','a-0', 'a-11', 'a-2') y = sorted(x, key=lambda s: (s.split('-')[0], int(s.split('-')[1]))) print(y) # 输出:['a-0', 'a-1', 'a-2', 'a-11', 'a-34', 'b-5']
方法三:正则提取数字(适用于格式不固定的场景)
如果字符串的数字位置不固定(比如是'a123'、'abc45'这种格式),可以用正则表达式提取出字符串里的数字部分:
import re x = ('a-34','a-1','a-0', 'a-11', 'a-2') y = sorted(x, key=lambda s: int(re.search(r'\d+', s).group())) print(y) # 输出:['a-0', 'a-1', 'a-2', 'a-11', 'a-34']
正则r'\d+'会匹配字符串里连续的数字,re.search()找到第一个匹配的数字序列,转成整数后作为排序依据,这种方法兼容性更强。
内容的提问来源于stack exchange,提问作者Sofia
相关产品推荐
相关产品推荐

