如何在Python中实现符合ASCII顺序的不区分大小写字符串列表排序?
如何在Python中实现符合ASCII顺序的不区分大小写字符串列表排序?
我明白你的需求啦——你想要的是不区分大小写分组排序,但在同一字母的分组里,要严格按照ASCII顺序让大写字母排在小写字母前面,而不是依赖原列表的顺序或者只按转换后的key排序。
你之前用str.lower/str.upper/str.casefold作为key的方法,确实能把相同字母的元素归到一组,但因为Python的排序是稳定排序,当两个元素的key相同时,会保留它们在原列表中的相对顺序。你的原列表是['b', 'B', 'a', 'A'],'a'原本就在'A'前面,所以排序后它们的顺序没变,才会出现['a', 'A', 'b', 'B']的结果,不符合你想要的ASCII优先级。
要实现你要的效果,我们需要让排序的key包含两个维度的信息:
- 首先是不区分大小写的字母(用来把相同字母的元素归为一组);
- 然后是原字符本身(用来在同一组内按ASCII顺序排序,毕竟大写字母的ASCII值确实比小写字母小)。
直接用一个元组作为key就行,一行代码搞定:
lst = ['b', 'B', 'a', 'A'] lst.sort(key=lambda x: (x.lower(), x)) print(lst) # 输出: ['A', 'a', 'B', 'b']
或者换种写法(效果完全一致):
lst.sort(key=lambda x: (str.lower(x), x))
简单解释下这个逻辑:当比较两个元素时,Python会先对比元组的第一个元素(小写后的字符),把相同字母的元素归到一起;如果第一个元素相同,就对比第二个元素(原字符),因为'A'的ASCII值(65)小于'a'的ASCII值(97),所以大写字母自然会排在同组的小写字母前面,完全符合你的要求。
备注:内容来源于stack exchange,提问作者Apostolos
相关产品推荐
相关产品推荐

