2015-04-07 72 views
1

我有這個類:我如何按組排序?

class Model: 
    name = None 
    price = None 

而且Model情況下,像這樣的普通數組:

name ; price 
BMW 4-series ; 90 
BMW Z4 ; 190 
BMW X5 ; 220 
Lamborghini Miura ; 910 
Ferrari 458 Italia ; 580 
Ferrari California T ; 530 

等等。我需要這個數組以兩種方式進行排序:按品牌首先,(所以,寶馬的物品是第一位的),然後通過價格,而沒有消除以前的影響。

問題是,如果我按照name排序sort()屬性,然後按price,第一個排序效果將會丟失。我該怎麼辦?

回答

5

您可以按使用operator.attrgetter

from operator import attrgetter 

m1 = Model(name='Lamborghini Miura', price=910) 
m2 = Model(name='Ferrari 458 Italia', price=580) 
lst = [m1, m2] 

lst.sort(key=attrgetter('name', 'price')) 
+2

我其實不知道你可以指定多個參數給'... getter's –

+0

@AdamSmith是的。另外我覺得'attrgetter'要快一點。 – styvane

+1

它當然更快。 –

5

所有sort函數都帶有可選的kwarg key。它可以結合使用的事實,元組這樣自然排序,以建立一個匿名lambda功能,像這樣:

lst = [Model(name='BMW 4-series',price=90), ... ] 
lst.sort(key=lambda m: (m.name, m.price))