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

Posted

技术标签:

【中文标题】Python:根据属性对对象列表进行排序【英文标题】:Python: Sort a list of objects based on their attributes 【发布时间】:2014-12-06 06:30:17 【问题描述】:

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

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

    如果属性是字符串(按字母顺序排列) 如果属性是整数(按数字顺序)

这是我的课程列表:

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

所以我真正在寻找的是一种方法来对这个列表进行排序,使英雄的名字按字母顺序排序,然后是另一种级别的方法。谢谢!

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于Python:根据属性对对象列表进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何根据对象的属性对对象列表进行排序?

Python入门题045:根据对象属性进行排序

如何根据属性值对对象列表进行排序

Python中元祖对象排序

根据总值对对象数组列表进行排序

按属性对对象列表进行排序[重复]