如何对含数字的混合字符串列表进行自然排序以得到预期结果?
解决字符串列表的自然数字排序问题
默认的list.sort()方法是按字典序排序的,所以会出现'img11'排在'img2'前面的情况——因为逐个字符比较时,'1'的ASCII码小于'2'。要实现按数字大小的自然排序,需要自定义排序的key函数,提取字符串中的数字部分并转为整数作为排序依据。
方法1:固定前缀时直接切片提取数字
如果所有字符串的前缀都是固定的'img',可以直接通过字符串切片获取数字部分,转为整数:
l = ['img1','img2','img11','img3'] l.sort(key=lambda x: int(x[3:])) print(l) # 输出: ['img1', 'img2', 'img3', 'img11']
方法2:用正则表达式提取数字(通用场景)
如果字符串前缀不固定,或者数字位置不确定,用正则表达式提取所有数字部分更通用:
import re l = ['img1','img2','img11','img3'] l.sort(key=lambda x: int(re.search(r'\d+', x).group())) print(l) # 输出: ['img1', 'img2', 'img3', 'img11']
这里re.search(r'\d+', x)会匹配字符串中的第一个连续数字序列,转为整数后作为排序的依据。
内容的提问来源于stack exchange,提问作者M.Pt
相关产品推荐
相关产品推荐

