Python:根据对象的属性对对象列表进行排序

时间:2014-10-11 02:22:48

标签: python list class sorting

仅作为序言,我已经查看了与此问题有关的帖子,他们还没有完全回答我的问题。

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

  1. 如果属性是字符串(以字母顺序排列)
  2. 如果属性是整数(按数字顺序执行)
  3. 这是我的课程列表:

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

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

1 个答案:

答案 0 :(得分:2)

sortedlist.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)返回一个元组。元组逐项进行比较。如果第一项相同,则比较下一项,......

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

使用operator.attrgetter替代方案:

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