语言敏感的分类是一个复杂的问题:
有三个办法:
- Use PyICU
- Use a locale based sort key
- Create your own function to process the sort keys
<>PyICU:
如果贵方守则需要在一个以上业务系统上开展工作,那么团结互助会是最佳的跨平台解决办法。
import icu
collator = icu.Collator.createInstance(icu.Locale( hu_HU ))
data = [ c , á , b , z , é , a , d , e , f , Ő , Ű , ő , ű ]
print(sorted(data, key=collator.getSortKey))
# [ a , á , b , c , d , e , é , f , ő , Ő , ű , Ű , z ]
但是,欧佩集团宁愿引导这一解决办法。
www.un.org/Depts/DGACM/index_spanish.htm
不同平台和校准执行的结果可能因当地使用而有所不同。
基本法典是:
import locale
locale.setlocale(locale.LC_COLLATE, hu_HU.UTF-8 )
data = [ c , á , b , z , é , a , d , e , f , Ő , Ű , ő , ű ]
print(sorted(data, key=locale.strxfrm))
成果各不相同。 macOS不支持匈牙利的串通。 不使用glibc的六氯环己烷分布不会支持匈牙利的串通。 我没有把Windows列入下表,但会正确工作。
Alpine: [ a , b , c , d , e , f , z , á , é , Ő , ő , Ű , ű ]
Freebsd: [ a , á , b , c , d , e , é , f , ő , Ő , ű , Ű , z ]
macOS: a , b , c , d , e , f , z , á , é , Ő , ő , Ű , ű ]
Ubuntu: [ a , á , b , c , d , e , é , f , ő , Ő , ű , Ű , z ]
<<>Custom>
另一种做法是,在使用敏感度和案件不敏感的关键时,写出一种习惯功能:
import unicodedata as ud
import regex
data = [ c , á , b , z , é , a , d , e , f , Ő , Ű , ő , ű ]
# accent and case insensitive
def ai_si(x):
xn = ud.normalize("NFD", x.casefold())
xn = regex.sub(r p{Mn} , , xn)
return (xn, x.swapcase())
print(sorted(data, key=ai_si))
。 如果回到了<条码>x,则单体和二字体将被完全忽略,这意味着其最终位置与其在名单上的地位相对应。 页: 1
我们可以将<条码>x或<条码>x.swapcase()作为附件的第二个要素。 <代码>x将形成一种顺序,在较低类别之前通常(但并不总是)对上级特性进行分类。 虽然x.swapcase()
扭转了案件之间的相对次序。 还有其他办法,可以构建图人的第二个要素。
ai_si(
>允许对二英和个案作二次区分。