2014-10-11 4 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) возвращает кортеж. Кортежи сравниваются по элементам. Если первые детали такие же, следующие элементы сравниваются, ...

>>> ('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)] 
Смежные вопросы