Python sorting - список объектов - PullRequest
       5

Python sorting - список объектов

35 голосов
/ 26 февраля 2010

Я бы хотел использовать метод somelist.sort (), чтобы сделать это, если это возможно.

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

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

Спасибо!

Ответы [ 3 ]

72 голосов
/ 26 февраля 2010
somelist.sort(key = lambda x: x.resultType)

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

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

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

10 голосов
/ 26 февраля 2010

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

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

Итак, в вашем случае ...

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 голос
/ 26 февраля 2010
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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...