Как мне сделать мой класс сопоставимым в Python? - PullRequest
0 голосов
/ 20 июня 2020

У меня есть класс Pair (у него есть ключ и значение), и я пытаюсь создать программу, которая создает группу объектов Pair, добавляет их в список и выполняет стабильную быструю сортировку на них. Однако я не могу понять, как сделать объекты сопоставимыми, чтобы программа автоматически сравнивала ключи двух объектов, когда они имеют одинаковое значение. Это так легко сделать в Java, но я просто не понимаю, как я должен сделать эквивалент в Python.

Заранее спасибо!

class Pair(Generic[K,V]):
    def __init__(self, key: K, val: V):
        self.key = key
        self.value = val

Ответы [ 2 ]

2 голосов
/ 20 июня 2020

Как насчет следующего (пара, сортируемая по ключу, но вы можете легко определить любой другой способ их сортировки):

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__. Дополнительные операторы см. здесь

0 голосов
/ 20 июня 2020

Python использует для этого так называемые «dunder-методы» (методы двойного подчеркивания). Вы уже используете метод init dunder. Определите __eq__.

Изменить: см. Отличную статью dbader

...