gpt4 book ai didi

python - 在 python 中对具有特定语言环境的字符串列表进行排序

转载 作者:太空狗 更新时间:2023-10-29 20:54:38 25 4
gpt4 key购买 nike

我开发的应用程序使用不同语言的文本,因此,为了查看或报告目的,一些文本(字符串)需要按特定语言排序。

目前我有一个解决全局区域设置的方法,这很糟糕,我不想将其投入生产:

default_locale = locale.getlocale(locale.LC_COLLATE)

def sort_strings(strings, locale_=None):
if locale_ is None:
return sorted(strings)

locale.setlocale(locale.LC_COLLATE, locale_)
sorted_strings = sorted(strings, cmp=locale.strcoll)
locale.setlocale(locale.LC_COLLATE, default_locale)

return sorted_strings

官方 python 语言环境文档明确表示保存和恢复是个坏主意,但没有给出任何建议:http://docs.python.org/library/locale.html#background-details-hints-tips-and-caveats

最佳答案

您可以使用 PyICU整理器以避免更改全局设置:

import icu # PyICU

def sorted_strings(strings, locale=None):
if locale is None:
return sorted(strings)
collator = icu.Collator.createInstance(icu.Locale(locale))
return sorted(strings, key=collator.getSortKey)

例子:

>>> L = [u'sandwiches', u'angel delight', u'custard', u'éclairs', u'glühwein']
>>> sorted_strings(L)
['angel delight', 'custard', 'glühwein', 'sandwiches', 'éclairs']
>>> sorted_strings(L, 'en_US')
['angel delight', 'custard', 'éclairs', 'glühwein', 'sandwiches']

缺点:依赖 PyICU library ;该行为与 locale.strcoll 略有不同。


我不知道如何在给定语言环境名称的情况下在不全局更改的情况下获取 locale.strxfrm 函数。作为一个hack,您可以在不同的子进程中运行您的函数:

pool = multiprocessing.Pool()
# ...
pool.apply(locale_aware_sort, [strings, loc])

缺点:可能很慢,耗费资源


使用普通的 threading.Lock 是行不通的,除非你可以控制每一个区域感知功能的地方(它们不限于 locale 模块,例如,re ) 可以从多个线程调用。


您可以使用 Cython 编译您的函数以使用 GIL 同步访问。 GIL 将确保在您的函数运行时不会执行其他 Python 代码。

缺点:不是纯 Python

关于python - 在 python 中对具有特定语言环境的字符串列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11121636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com