#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
это уже целое число, но да, это действительно чище (и в то же время исправлена моя опечатка 🙂