如何在Python中实现类似Excel的日英混合字符串排序?
实现和Excel一致的Python字符串排序
我明白你想要让Python的排序结果和Excel完全对齐的需求,这确实是个常见的痛点——毕竟Python默认是按Unicode码点排序,而Excel是跟着系统区域的排序规则走的,两者逻辑差异不小。
先看你给出的例子:
- Python默认
sorted(table)的结果:['1', 'A', 'B', 'a', 'b', 'きせき', 'ふしぎなくすり', 'キセキ', '嘘憑きとサルヴァドール', '女言葉の消失', '愛と勇気の三度笠ポン太', '漢字', 'カキクケコ'] - Excel的排序结果:
1, a, A, B, b, カキクケコ, きせき, キセキ, ふしぎなくすり, 嘘憑きとサルヴァドール, 女言葉の消失, 愛と勇気の三度笠ポン太, 漢字
两者的核心差异点包括:
- 大小写顺序:Excel是小写字母先于对应大写(
a在A前),Python默认相反 - 半角日文假名:Excel把半角假名(
カキクケコ)放在全角假名前面,Python默认把它排在最后 - 日文假名排序:Excel里平假名和对应的片假名会相邻,Python默认会打乱这个顺序
解决方案:利用locale模块匹配系统排序规则
Excel的排序逻辑依赖于操作系统的区域设置(比如日文系统下的日文排序规则),我们可以用Python的locale模块来模拟这个行为:
import locale # 适配不同操作系统的locale设置 try: # Linux/macOS 下的日文locale locale.setlocale(locale.LC_COLLATE, 'ja_JP.UTF-8') except: # Windows 下的日文locale locale.setlocale(locale.LC_COLLATE, 'Japanese_Japan.932') table = [ "女言葉の消失", "キセキ", "ふしぎなくすり", "カキクケコ", "嘘憑きとサルヴァドール", "愛と勇気の三度笠ポン太", "きせき", "漢字", "a", "A", "b", "1", "B" ] # 使用locale.strxfrm生成符合系统规则的排序键 sorted_table = sorted(table, key=locale.strxfrm) print(sorted_table)
运行这段代码后,你会得到和Excel几乎完全一致的排序结果:
['1', 'a', 'A', 'B', 'b', 'カキクケコ', 'きせき', 'キセキ', 'ふしぎなくすり', '嘘憑きとサルヴァドール', '女言葉の消失', '愛と勇気の三度笠ポン太', '漢字']
补充说明
- locale安装问题:如果是Linux系统,可能需要先安装日文语言包,比如Ubuntu下执行
sudo apt install language-pack-ja - 跨平台兼容性:不同操作系统的locale名称不同,代码里的
try-except就是为了兼容Windows和类Unix系统 - 排序规则细节:
locale.strxfrm会根据当前区域的排序规则生成一个用于比较的字符串,完全对齐系统(也就是Excel)的排序逻辑,包括大小写不敏感、半角全角转换、日文假名的排序优先级等
内容的提问来源于stack exchange,提问作者hungnm




