Сортировка списка объектов нескольких классов a по значению

#python-3.x

#python-3.x

Вопрос:

Итак, я потратил на это смущающе много времени, но на самом деле быстро ничего не получается.

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

 [<__main__.OrderRecord object at 0x02D357D0>, <__main__.OrderRecord object at 0x02D35850>]
  

Элементы каждого объекта класса включены в этот:

 class OrderRecord:
    """The OrderRecord class
    Data attributes: date of type str
                     location of type str
                     name of type str
                     colour of type str
                     ordernum of type int
                     cost of type int
"""
def __init__(self, file_line):
    """Takes a given file line and initialises an OrderRecord instance"""

    split_file = file_line.split(",")
    self.date = split_file[0]
    self.location = split_file[1]
    self.name = split_file[2]
    self.colour = split_file[3]
    self.ordernum = split_file[4]
    self.costs = self.cost_of_order()
  

Итак, я пытаюсь отсортировать этот список объектов класса по возрастанию «ordernum», например, сначала по младшим числам. Это 4-й индекс в объекте класса. Надеюсь, я включил сюда всю необходимую информацию.

Ответ №1:

Предположим, что у вас есть свой список OrderRecord элементов the_list .

Вы можете отсортировать его на месте, используя:

 the_list.sort(key=lambda e : int(e.ordernum))
  

вы должны преобразовать ключ сортировки в целое число, если вы используете класс как есть, или вы должны сделать это в конструкторе:

 self.ordernum = int(split_file[4])
  

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

 the_list.sort(key=lambda e : e.ordernum)
  

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

Примечание: если 2 объекта имеют одинаковое ordernum значение, и вы хотите добавить второй критерий (или больше …), менее приоритетный, вы можете сделать это следующим образом (вернуть кортеж в качестве ключа сортировки, с помощью attrgetter которого создается кортеж для вас):

 the_list.sort(key=lambda e : e.attrgetter(ordernum,name))
  

(теперь предположим, что e.ordernum это уже целочисленный тип)

Комментарии:

1. С последним, вероятно, было бы лучше operator.attrgetter() .

2. @alecxe ты имеешь в виду the_list.sort(key=lambda e : e.attrgetter('ordernum')) ? в чем преимущество этого (честный вопрос, без иронии)? неважно, я сейчас это понимаю, редактирую. Вы можете сделать это, только если ordernum это уже целое число, но да, это действительно чище (и в то же время исправлена моя опечатка 🙂