2014-10-11 133 views
0

只是为了说明这一点,我已经检查了与这个问题有关的帖子,但他们没有完全回答我的问题。Python:根据对象的属性对对象列表进行排序

所以我只是想知道如何根据其属性的对象的列表两种方式进行排序:

  1. 如果属性是一个字符串(按字母顺序排列)
  2. 如果属性是整数(由数字顺序做)

这是我的班名单:

mainList = [ 
    hero(name='SirGoose', classes='Fighter', level=150), 
    hero(name='Conan', classes='Barbarian', level=160), 
    hero(name='KingArthur', classes='Knight', level=170) 
] 

所以我真正想要的是一种排序此列表的方式,即英雄的姓名按字母顺序排序,然后是另一种级别的方法。谢谢!

回答

2

sorted,list.sort接受可选key参数。通过一个关键功能。该函数的返回值被用于比较,而不是原始值:

>>> from collections import namedtuple 
>>> hero = namedtuple('hero', ['name', 'classes', 'level']) 
>>> 
>>> mainList = [ 
...  hero(name='SirGoose', classes='Fighter', level=150), 
...  hero(name='Conan', classes='Barbarian', level=160), 
...  hero(name='KingArthur', classes='Knight', level=170) 
... ] 
>>> sorted(mainList, key=lambda h: (h.name, h.level)) 
[hero(name='Conan', classes='Barbarian', level=160), 
hero(name='KingArthur', classes='Knight', level=170), 
hero(name='SirGoose', classes='Fighter', level=150)] 

注:这里使用的键功能(lambda)返回一个元组。元组逐个比较。如果第一项是相同的,在未来加以比较,...用operator.attrgetter

>>> ('SirGoose', 12) < ('Barbarian', 160) 
False 
>>> ('SirGoose', 12) < ('SirGoose', 160) 
True 

备选:

>>> import operator 
>>> sorted(mainList, key=operator.attrgetter('name', 'level')) 
[hero(name='Conan', classes='Barbarian', level=160), 
hero(name='KingArthur', classes='Knight', level=170), 
hero(name='SirGoose', classes='Fighter', level=150)] 
相关问题