如何对末尾含数字的Python字符串列表按数字升序排序?
解决Python列表按字符串末尾数字升序排序的问题
嘿,我太懂你遇到的坑了——默认的sorted()函数是按字符串的字典序来排序的,这就会导致像n.10这种字符串,因为第一个字符是'1',会排在n.2前面,完全不是你想要的数字升序效果对吧?
别担心,咱们只需要给sorted()指定一个自定义排序键,也就是从每个字符串里提取出末尾的数字,把它转成整数再用来排序就行。下面给你两种实用的解决方案:
方案一:用单独函数提取数字(可读性更强)
这种方式适合需要重复使用提取逻辑的场景,代码更清晰:
import re # 你的原始列表 original_list = [u'TC DUMAZILE. Warning n.12', u'TC DUMAZILE. Warning n.4', u'TC DUMAZILE. Warning n.8', u'TC ELEVEN. Warning n.1', u'TC ELIAKIM. Warning n.10', u'TC ELIAKIM. Warning n.14', u'TC ELIAKIM. Warning n.2', u'TC ELIAKIM. Warning n.6', u'TC HOLA. Warning n.4', u'TC HOLA. Warning n.8', u'TC TWELVE. Warning n.1'] def get_trailing_number(s): # 用正则匹配字符串末尾的所有数字 num_match = re.search(r'\d+$', s) if num_match: # 把匹配到的字符串转成整数 return int(num_match.group()) # 如果没有找到数字,默认返回0让它排在最前面 return 0 # 按提取到的数字升序排序 sorted_list = sorted(original_list, key=get_trailing_number) # 输出看看结果 for item in sorted_list: print(item)
方案二:用Lambda表达式简化代码(更简洁)
如果只是一次性使用,用lambda可以少写几行代码:
import re original_list = [u'TC DUMAZILE. Warning n.12', u'TC DUMAZILE. Warning n.4', u'TC DUMAZILE. Warning n.8', u'TC ELEVEN. Warning n.1', u'TC ELIAKIM. Warning n.10', u'TC ELIAKIM. Warning n.14', u'TC ELIAKIM. Warning n.2', u'TC ELIAKIM. Warning n.6', u'TC HOLA. Warning n.4', u'TC HOLA. Warning n.8', u'TC TWELVE. Warning n.1'] # 一行完成排序,lambda里直接提取并转换数字 sorted_list = sorted(original_list, key=lambda x: int(re.search(r'\d+$', x).group()))
补充说明:
- 正则表达式
r'\d+$'的作用是匹配字符串末尾的连续数字,不管前面的内容是什么,只要最后是数字就能提取出来。 - 如果你的列表里可能存在没有数字的字符串,可以给lambda加个容错判断,避免报错:
sorted_list = sorted(original_list, key=lambda x: int(re.search(r'\d+$', x).group()) if re.search(r'\d+$', x) else 0)
运行上面的代码后,你会得到按数字升序排列的列表,结果应该是这样的:
TC ELEVEN. Warning n.1
TC TWELVE. Warning n.1
TC ELIAKIM. Warning n.2
TC DUMAZILE. Warning n.4
TC HOLA. Warning n.4
TC ELIAKIM. Warning n.6
TC DUMAZILE. Warning n.8
TC HOLA. Warning n.8
TC ELIAKIM. Warning n.10
TC DUMAZILE. Warning n.12
TC ELIAKIM. Warning n.14
内容的提问来源于stack exchange,提问作者user1919
相关产品推荐
相关产品推荐

