Python中如何正确排序含大小写、重音字符的人名列表
问题解答
错误原因
你之前的写法存在两个核心问题:
unidecode.unidecode返回的结果会保留原字符串的大小写,小写开头的字符串转换后首字母仍为小写,ASCII编码高于所有大写字母,导致andré转码后的'andre'排序比所有大写开头的转码结果都靠后,最终出现在列表末尾。- 多优先级排序通过多次调用
sorted容易搞混优先级顺序,直接使用元组作为排序key逻辑更清晰,也不容易出错。
正确实现
直接把排序优先级按顺序写入key的元组即可,一次排序就能得到符合预期的结果:
import unidecode l = ['André','Gerald','Nicole','François','Fraçois','andré'] # 排序优先级: # 1. 去重音后统一转小写,保证不同重音、大小写的同人名排在一起 # 2. 原字符串统一转小写,保证同人名的不同拼写按序排列 # 3. 原字符串,保证同一拼写的大写开头版本排在小写前面 sorted_l = sorted(l, key=lambda x: (unidecode.unidecode(x).casefold(), x.casefold(), x)) print(sorted_l)
输出结果
['André', 'andré', 'Fraçois', 'François', 'Gerald', 'Nicole']
注:你给出的期望结果里
'François'后漏了逗号,属于笔误,实际运行结果和需求一致。
可选本地化方案
如果你需要适配更复杂的本地语言排序规则,也可以使用系统的locale能力,无需引入unidecode依赖:
import locale # 根据人名所属语言设置对应本地化规则,示例为法语 locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8') sorted_l = sorted(l, key=lambda x: (locale.strxfrm(x.casefold()), locale.strxfrm(x)))
该方案的排序结果会和系统本地化配置强相关,跨平台运行一致性不如unidecode方案。
内容的提问来源于stack exchange,提问作者felipesveiga
相关产品推荐
相关产品推荐

