2010-10-24 4 views
40

У меня есть список экземпляров класса -Сортировать список экземпляров класса Python

x = [<iteminstance1>,...] 

среди прочих атрибутов класс имеет score атрибут. Как я могу сортировать элементы в порядке возрастания на основе этого параметра?

EDIT: list В python есть что-то под названием sort. Могу ли я использовать это здесь? Как мне настроить эту функцию на использование моего атрибута score?

ответ

64
import operator 
sorted_x = sorted(x, key=operator.attrgetter('score')) 

если вы хотите отсортировать х на месте, вы также можете:

x.sort(key=operator.attrgetter('score')) 
+1

wow! это так просто !! Просто проверил. Это :) – 2010-10-24 20:37:41

+7

Добро пожаловать на Python! Для полноты: параметр «ключ» для функций/методов srot принимает функцию в качестве ее параметра. Модуль оператора предоставляет полезные функции для задач, которые обычно выполняются самим языком Синтаксис - как функция «добавить», чтобы сделать то же самое, что и токен «+» на языке, и в этом случае attrgetter делает то же самое, . "в синтаксисе. Другими параметрами для «ключа» могут быть функции на месте, определенные с помощью «лямбда». В этом случае sorted_x = sorted (x, lambda x: x.score)) тоже работал бы. Однако данный пример лучше. – jsbueno

+1

Я не уверен, что лучше использовать 'attrgetter'. Кажется, что Лямбдас так же быстро, и выглядит чище ИМО. – adw

88

В дополнение к решению вы приняли, можно также реализовать («меньше») метод специального __lt__() на классе. Метод sort() (и функция sorted()) затем сможет сравнивать объекты и тем самым сортировать их. Тем не менее, это лучше всего работает, когда вы будете только сортировать их по этому атрибуту.

class Foo(object): 

    def __init__(self, score): 
     self.score = score 

    def __lt__(self, other): 
     return self.score < other.score 

l = [Foo(3), Foo(1), Foo(2)] 
l.sort() 
+1

Это особенно полезно, если у вас нет доступа к отсортированной функции. Это происходит, когда сортировка вызывается некоторыми другими модулями, такими как стандартные библиотечные модули. Пример - 'priorityqueue' в' queue' вызовы отсортированы для товаров, которые вы поставляете. –

+1

Что делать, если у нас есть экземпляры с двумя параметрами, такими как Foo ['abc', 3] –

+1

@BimleshSharma Затем напишите свой метод '__lt__' в соответствии с тем, как вы хотите, чтобы ваши экземпляры сравнивались, например. 'return (self.text, self.num) <(other.text, other.num)'. – kindall

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