一、前言
列表排序基础: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']