Подтвердить что ты не робот

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

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

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

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

Спасибо!

4b9b3361

Ответ 1

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

Здесь можно использовать другой способ сделать то же самое, что вы часто увидите:

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

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

Ответ 2

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

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'))

Ответ 3

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, которая более ясна.