2015-04-07 5 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 

И так далее .. мне нужно отсортировать этот массив в двух направлениях: во-первых, бренд (поэтому на BMW сначала наступают), а затем по цене, не удаляя предыдущий эффект.

Проблема в том, что если я сделаю sort(), сортировка по атрибуту name, а затем по 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 yes. Также я думаю, что «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)) 
Смежные вопросы