Как насчет следующего (пара, сортируемая по ключу, но вы можете легко определить любой другой способ их сортировки):
class Pair:
def __init__(self, key, val):
self.key = key
self.value = val
def __eq__(self, other: "Pair"):
return self.key == other.key
def __lt__(self, other: "Pair"):
return self.key < other.key
def __le__(self, other: "Pair"):
return self.key <= other.key
def __gt__(self, other: "Pair"):
return self.key > other.key
def __ge__(self, other: "Pair"):
return self.key >= other.key
def __str__(self):
return f"{self.key}={self.value}"
def __repr__(self):
return f"{self.key}={self.value} ({id(self)})"
test = [
Pair("a2", "1"), Pair("a1", "2"), Pair("b1", "3"),Pair("br", "4")
]
print(sorted(test))
Вывод:
$ python3 ~/tmp/test.py
[a1=2 (4352627216), a2=1 (4352622288), b1=3 (4352627344), br=4 (4352627408)]
Для сортировки по значению и затем по ключу, если значения равны, вы должны создать что-то вроде:
def __lt__(self, other: "Pair"):
if self.value != other.value:
return self.value < other.value
return self.key < other.key
пример ввода / вывода с указанным выше lt
:
# Input
test = [
Pair("a2", "1"), Pair("a1", "2"), Pair("b1", "1"),Pair("br", "4")
]
# Output
[a2=1 (4466773648), b1=1 (4466778768), a1=2 (4466778640), br=4 (4466778832)]
Кроме того, если вы планируете использовать пары как ключи словаря или в наборах вы можете реализовать __hash__
. Дополнительные операторы см. здесь