假设我有一个名为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)]
答案 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)]