You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Python中实现类似Excel的日英混合字符串排序?

实现和Excel一致的Python字符串排序

我明白你想要让Python的排序结果和Excel完全对齐的需求,这确实是个常见的痛点——毕竟Python默认是按Unicode码点排序,而Excel是跟着系统区域的排序规则走的,两者逻辑差异不小。

先看你给出的例子:

  • Python默认sorted(table)的结果:
    ['1', 'A', 'B', 'a', 'b', 'きせき', 'ふしぎなくすり', 'キセキ', '嘘憑きとサルヴァドール', '女言葉の消失', '愛と勇気の三度笠ポン太', '漢字', 'カキクケコ']
    
  • Excel的排序结果:
    1, a, A, B, b, カキクケコ, きせき, キセキ, ふしぎなくすり, 嘘憑きとサルヴァドール, 女言葉の消失, 愛と勇気の三度笠ポン太, 漢字
    

两者的核心差异点包括:

  • 大小写顺序:Excel是小写字母先于对应大写(aA前),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', 'カキクケコ', 'きせき', 'キセキ', 'ふしぎなくすり', '嘘憑きとサルヴァドール', '女言葉の消失', '愛と勇気の三度笠ポン太', '漢字']

补充说明

  1. locale安装问题:如果是Linux系统,可能需要先安装日文语言包,比如Ubuntu下执行sudo apt install language-pack-ja
  2. 跨平台兼容性:不同操作系统的locale名称不同,代码里的try-except就是为了兼容Windows和类Unix系统
  3. 排序规则细节locale.strxfrm会根据当前区域的排序规则生成一个用于比较的字符串,完全对齐系统(也就是Excel)的排序逻辑,包括大小写不敏感、半角全角转换、日文假名的排序优先级等

内容的提问来源于stack exchange,提问作者hungnm

火山引擎 最新活动