2010-02-25 2 views
33

Я хотел бы использовать метод somelist.sort() для этого, если это возможно.Сортировка Python - список объектов

У меня есть список, содержащий объекты, все объекты имеют переменную-член переменной resultType, которая является целым числом. Я бы хотел отсортировать список, используя этот номер.

Как это сделать?

Спасибо!

ответ

67
somelist.sort(key = lambda x: x.resultType) 

Вот еще один способ сделать то же самое, что вы часто будете видеть используются:

import operator 
s.sort(key = operator.attrgetter('resultType')) 

Вы также можете посмотреть на sorted, если вы еще не видели его уже. Он не изменяет исходный список - он возвращает новый отсортированный список.

+0

Вы ответили на два моих вопроса (attrgetter ..) и указали мне на что-то полезное. Благодаря! – Art

+0

Ты помог мне понять, как сортировка отличается от сортировки! Спасибо – gl2748

10

Конечно, это не обязательно лямбда. Любая функция, которая передается, например, как показано ниже, будет работать

def numeric_compare(x, y): 
    if x > y: 
     return 1 
    elif x == y: 
     return 0 
    else: #x < y 
     return -1 

a = [5, 2, 3, 1, 4] 
a.sort(numeric_compare) 

Источник: Python Sorting

Таким образом, в вашем случае ...

def object_compare(x, y): 
    if x.resultType > y.resultType: 
     return 1 
    elif x.resultType == y.resultType: 
     return 0 
    else: #x.resultType < y.resultType 
     return -1 

a.sort(object_compare) 

Вышеупомянутая лямбда, безусловно, самый компактный способ сделать это, но также используется operator.itemgetter.

import operator 
#L = [('c', 2), ('d', 1), ('a', 4), ('b', 3)] 
map(operator.itemgetter(0), L) 
#['c', 'd', 'a', 'b'] 
map(operator.itemgetter(1), L) 
#[2, 1, 4, 3] 
sorted(L, key=operator.itemgetter(1)) 
#[('d', 1), ('c', 2), ('b', 3), ('a', 4)] 

Таким образом, вы бы использовали itemgetter ('resultType'). (. Если предположить, GetItem определен)

sorted(L, key=operator.itemgetter('resultType')) 
+1

cmp устарел - даже не существует в Python3. Вместо этого вы должны использовать ключевую функцию. –

+1

Спасибо за это.Мне всегда нравится смотреть не-лямбда-способы делать что-то, даже если я в конечном счете использую версию лямбды (она просто чувствует себя более сексуальной) – NickO

+0

Спасибо Rizwan. метод сравнения был полезен –

1
somelist.sort(cmp = lambda x, y: cmp(x.resultType, y.resultType)) 

лучше:

somelist.sort(key = lambda x: x.resultType) 

В первом случае мы переходим в функцию сравнения, которая используется для попарного сравнения элементов в списке. Во втором случае мы выделяем новый список пар результата ключевой функции и исходное значение. Затем мы сортируем этот список, затем отделяем значения ключей от пар. Это действительно полезно, если ваша функция сравнения стоит дорого, но это всего лишь пустая трата памяти, если сравнение действительно дешево.

То есть, расширение ключа версии выглядит примерно так:

l = [y for x,y in sorted(zip([key(i) for i in l], l))] 

Для простой ключевой функции, что явно слишком много накладных расходов, так что вместо этого я предложил бы использовать более легкую функцию на основе сортировки.

Обратите внимание, что параметр функции cmp должен возвращать -1, 0, 1 в менее, равном и большем, чем случаи. Вы можете написать это самостоятельно, но вы также можете использовать встроенную функцию cmp, которая является более четкой.

+0

Вздох, спасибо @gnibbler, я не знал, что параметр cmp был устаревшим в Python 3, это хорошо знать. Но если вы находитесь в python 2.x, я думаю, что он более ясный и эффективный, чем ключевая версия. В Python 3 я буду следовать за Марком Байерсом. –

Смежные вопросы