Как отсортировать список, состоящий из классов?
Есть список:
a = [W('A', 101, 1), W('B', -1, 0), W('A', 11, 0), W('A', 111, -11)]
W - это класс. Для сортировки используется W.sort(), который сортирует список по трём элементам:
W('A', 11, 0), W('A',101, 1), W('A', 111, -11), W('B', -1, 0)
Помогите, пожалуйста!
Ответы (2 шт):
Для нормального ответа, конечно, нужно привести код самого класса, но предположим, что вы передаете в конструктор три параметра класса - a, b, c. Тогда для сортировки сразу по 3м полям нужно передать в метод sort функцию сортировки, которая будет возвращать кортеж из трех значений в порядке приоритетности сортировки по ним. Удобнее всего это сделать через lambda-функцию.
a = [W('A', 101, 1), W('B', -1, 0), W('A', 11, 0), W('A', 111, -11)]
a.sort(key=lambda obj: (obj.a, obj.b, obj.c))
Задача не совсем понятна, но вот вам такой вариант. Для того, чтобы можно было использовать любую стандартную сортировку с вашим классом, в нём достаточно описать функцию сравнения экземпляров класса __lt__:
class W:
def __init__(self, *args):
self.data = args
def __lt__(self, other):
return self.data < other.data
def __repr__(self):
return f'W{str(self.data)}'
a = [W('A', 101, 1), W('B', -1, 0), W('A', 11, 0), W('A', 111, -11)]
a.sort()
print(a)
Вывод:
[W('A', 11, 0), W('A', 101, 1), W('A', 111, -11), W('B', -1, 0)]
Совет про сортировку экземпляров класса подсмотрен на английском SO.