2014-10-26 55 views
0

假设我有一类叫做主题:正确的属性排序对象的列表,与一捻

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)]

显然,这是不正确的。如何正确地按属性按字母顺序排序对象列表,并考虑大写/小写字母和unicode字符(如元音变音符号)?

最后,名单应该是这样的:

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

回答

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)] 

UPDATE
您需要安装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)] 
+0

虽然这解决了大写/小写排序的问题,但它仍不考虑列表中的最后一项。有任何想法吗? – 2014-10-26 16:51:56

+0

你是对的,最后一个元素不在正确的位置。我做了一些挖掘,并且这个主题已经在SO上得到了答案http://stackoverflow.com/questions/1097908/how-do-i-sort-unicode-strings-alphabetically-in-python – 2014-10-26 16:59:10

+0

我刚刚花了三个小时设置在两台不同的机器上安装ICU4C和PyICU,但这是完全值得的。谢谢! :D – 2014-10-26 21:56:19

相关问题