按属性正确排序对象列表,并进行扭曲

时间:2014-10-26 15:53:48

标签: sorting python-3.x python-3.4 python-unicode

假设我有一个名为Subject的课程:

class Subject():
    def __init__(self, name, longName):
        self.name = name
        self.long_name = longName

    def __repr__(self):
        return self.long_name + "(" + self.name + ")"

在我的代码中,我创建了一堆这些对象,分配名称和long_name,然后按字母顺序对列表进行排序

sorted(subjects, key=attrgetter("long_name"))

我得到的清单如下:

  

[BETRIEBSWIRTSCHAFT(BW),MATHEMATIK(MA),WIRTSCHAFTSINFORMATIK(WI),WIRTSCHAFTSLEHRE(WW),fio(fio),ÜBUNGSRATHAUS(ÜR)]

显然,那是不对的。如何通过属性按字母顺序对对象列表进行正确排序,同时考虑大小写/小写和unmode字符,如变音符号?

最后,列表应如下所示:

  

[BETRIEBSWIRTSCHAFT(BW),fio(fio),MATHEMATIK(MA),ÜBUNGSRATHAUS(ÜR),WIRTSCHAFTSINFORMATIK(WI),WIRTSCHAFTSLEHRE(WW)]

1 个答案:

答案 0 :(得分:1)

在对包含大写和小写的单词进行排序时,将它们全部转换为相同的大小写是有帮助的。

>>> sbjs = [('fio', 'fio'), 
        ('MA', 'MATHEMATIK'), 
        ('ÜR', 'ÜBUNGSRATHAUS'), 
        ('BW', 'BETRIEBSWIRTSCHAFT'), 
        ('WI', 'WIRTSCHAFTSINFORMATIK'), 
        ('WW', 'WIRTSCHAFTSLEHRE')]
>>> subjects = [Subject(x, y) for x, y in sbjs]

>>> sorted(subjects, key=lambda x: x.long_name)
[BETRIEBSWIRTSCHAFT(BW), MATHEMATIK(MA), WIRTSCHAFTSINFORMATIK(WI), WIRTSCHAFTSLEHRE(WW), fio(fio), ÜBUNGSRATHAUS(ÜR)]

>>> sorted(subjects, key=lambda x: x.long_name.lower())
[BETRIEBSWIRTSCHAFT(BW), fio(fio), MATHEMATIK(MA), WIRTSCHAFTSINFORMATIK(WI), WIRTSCHAFTSLEHRE(WW), ÜBUNGSRATHAUS(ÜR)]

<强>更新
您需要安装icu包。 pip install pyicu 在我的机器上工作。

>>> import icu

>>> collator = icu.Collator.createInstance(icu.Locale('de_DE.UTF-8'))

>>> sorted(subjects, key=lambda x: collator.getSortKey(x.long_name.lower()))
[BETRIEBSWIRTSCHAFT(BW), fio(fio), MATHEMATIK(MA), ÜBUNGSRATHAUS(ÜR), WIRTSCHAFTSINFORMATIK(WI), WIRTSCHAFTSLEHRE(WW)]