Python中含字母数字混合字符串列表的自定义排序问题
自定义排序实现优先按后缀、再按括号内数字排序
你的原始列表定义如下:
s1 = 'foo[2]_bar' s2 = 'foo[2]_ant' s3 = 'foo[1]_bar' s4 = 'foo[1]_ant' s5 = 'foo[10]_bar' s6 = 'foo[10]_ant' str_arr = [s1, s2, s3, s4, s5, s6]
默认的str_arr.sort()会按字符串的字符顺序排序,导致括号里的数字按字符串规则比较('10'会排在'1'前面),且后缀的顺序也不符合预期。要实现你要的排序效果,给sort()方法传入自定义的key参数即可,核心是用lambda函数构造合适的排序依据,不需要用到filter。
解决方案代码
str_arr.sort(key=lambda x: (x.split('_')[1], int(x.split('[')[1].split(']')[0]))) # 输出排序结果 for s in str_arr: print(s)
代码解释
lambda函数会为每个字符串生成一个元组作为排序键,排序时先按元组第一个元素比较,再按第二个元素比较:
- 第一个元素
x.split('_')[1]:把字符串按_分割,取后半段的ant或bar,确保所有ant排在bar前面 - 第二个元素
int(x.split('[')[1].split(']')[0]):先按[分割取后半段,再按]分割取前半段,得到括号里的数字字符串,转成整数后实现数字大小排序(而非字符串排序)
执行后输出的结果完全符合你的期望:
foo[1]_ant foo[2]_ant foo[10]_ant foo[1]_bar foo[2]_bar foo[10]_bar
内容的提问来源于stack exchange,提问作者winger
相关产品推荐
相关产品推荐

