Python-数字字符串排序

一、前言
【Python-数字字符串排序】列表排序基础:https://www.jianshu.com/p/44d4924744cb
列表的字符串包含数字,直接使用sorted()排序,得到的结果往往不如人意,如下:

your_list = ["a1", "a2", "a10", "b2", "b1"] print(sorted(your_list)) #输出 ['a1', 'a10', 'a2', 'b1', 'b2']

期望大多数是这样:['a1', 'a2', 'a10', 'b1', 'b2'],但是显然结果和期望是不符的,需要做处理。
二、纯数字字符串
shuzi_list = ['1', '4', '2', '3', '22', '23', '24', '33', '35'] print(sorted(shuzi_list)) #传参key,使用匿名函数,info指列表的数据,将字符串转为整数然后排序 print(sorted(shuzi_list, key=lambda info: (int(info)))) #输出 ['1', '2', '22', '23', '24', '3', '33', '35', '4'] ['1', '2', '3', '4', '22', '23', '24', '33', '35']

三、字符串一侧含有数字
#数字在左边,关注字符串截取 list2 = ['0.jpg', '1.jpg', '10.jpg', '11.jpg', '12.jpg', '13.jpg', '14.jpg', '15.jpg', '16.jpg', '17.jpg', '18.jpg', '19.jpg', '2.jpg', '20.jpg', '21.jpg', '22.jpg', '23.jpg', '24.jpg', '25.jpg', '3.jpg', '4.jpg', '5.jpg', '6.jpg', '7.jpg', '8.jpg', '9.jpg'] #新增传参key,类型为元组,对字符串分组处理,按照元组的两个值排序 print(sorted(list2, key=lambda info: (int(info[0:-4]), info[-4:])))#数字在右边,关注字符串截取 your_list = ["a1", "a2", "a10", "b2", "b1"] #同理 print(sorted(your_list, key=lambda info: (info[0], int(info[1:])))) #输出 ['0.jpg', '1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg', '6.jpg', '7.jpg', '8.jpg', '9.jpg', '10.jpg', '11.jpg', '12.jpg', '13.jpg', '14.jpg', '15.jpg', '16.jpg', '17.jpg', '18.jpg', '19.jpg', '20.jpg', '21.jpg', '22.jpg', '23.jpg', '24.jpg', '25.jpg'] ['a1', 'a2', 'a10', 'b1', 'b2']

四、字符串两边都有数字
字符串两边都是数字,用索引处理就很难了,需要用到正则表达式,提取数字进行排序
import re zh_list = ['故事-0.jpg', '故事-1.jpg', '故事重-10.jpg','故事重-13.jpg','故事重-3.jpg','故事重-4.jpg'] #用正则表达式提取数字排序 print(sorted(zh_list, key=lambda info: (int(re.findall(r'-(\d+).jpg', info)[0])))) #输出 ['故事-0.jpg', '故事-1.jpg', '故事重-3.jpg', '故事重-4.jpg', '故事重-10.jpg', '故事重-13.jpg']

    推荐阅读