2014-10-11 131 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)] 
相關問題