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

8

首先声明一下,我已经检查过有关这个问题的帖子,它们还没有完全回答我的问题。

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

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

这是我的类列表:

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

所以我真正需要的是一种方法,可以按字母顺序排序这个列表中的英雄名称,然后再使用另一种方法进行等级排序。谢谢!
1个回答

7

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接