Сортировка Python - список объектов

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

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

Как я делаю это?

Спасибо!

35
задан Art 25 February 2010 в 23:55
поделиться

3 ответа

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

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

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

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

73
ответ дан 27 November 2019 в 06:45
поделиться

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

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'))
10
ответ дан 27 November 2019 в 06:45
поделиться
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, которая более понятна.

1
ответ дан 27 November 2019 в 06:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: