如何使我的类在Python中具有可比性?

如何使我的类在Python中具有可比性?,python,oop,quicksort,comparable,keyvaluepair,Python,Oop,Quicksort,Comparable,Keyvaluepair,我有一个Pair类(它有一个键和一个值),我试图制作一个程序,创建一组Pair对象,将它们添加到列表中,并对它们执行稳定快速排序。但是,我似乎不知道如何使对象具有可比性,以便程序在两个对象具有相同值时自动比较它们的键。在Java中实现这一点很容易,但我不知道如何在Python中实现同样的功能 提前谢谢你 class Pair(Generic[K,V]): def __init__(self, key: K, val: V): self.key = key

我有一个Pair类(它有一个键和一个值),我试图制作一个程序,创建一组Pair对象,将它们添加到列表中,并对它们执行稳定快速排序。但是,我似乎不知道如何使对象具有可比性,以便程序在两个对象具有相同值时自动比较它们的键。在Java中实现这一点很容易,但我不知道如何在Python中实现同样的功能

提前谢谢你

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

Python为此使用了所谓的“dunder方法”(双下划线方法)。您已经在使用init dunder方法。定义
\uuuuuuuueq\uuuu


编辑:请参见优秀的

Python为此使用了所谓的“dunder方法”(双下划线方法)。您已经在使用init dunder方法。定义
\uuuuuuuueq\uuuu

编辑:请参阅优秀的

以下内容如何(按键配对排序,但您可以轻松定义任何其他排序方式):

要先按值排序,然后按键排序,如果值相等,您可以执行以下操作:

    def __lt__(self, other: "Pair"):
        if self.value != other.value:
            return self.value < other.value

        return self.key < other.key
此外,如果您计划将这些对用作字典键或在集合中使用,则可以实现
\uuuuuuuuuuuuuuuuuuuuuuuuuu
。有关更多运算符,请参见以下内容(按键配对排序,但您可以轻松定义任何其他排序方式):

要先按值排序,然后按键排序,如果值相等,您可以执行以下操作:

    def __lt__(self, other: "Pair"):
        if self.value != other.value:
            return self.value < other.value

        return self.key < other.key

此外,如果您计划将这些对用作字典键或在集合中使用,则可以实现
\uuuuuuuuuuuuuuuuuuuuuuuuuu
。有关更多操作员的信息,请参见此处:这是否回答了您的问题?这回答了你的问题吗?非常感谢你!这真的很彻底,也很有帮助。另外,如果值在
\uu lt\uu
方法中相同,而在其他任何地方都不相同,那么为什么要区分比较键呢?@user11610667这个想法是为了向您展示可以覆盖的最重要的方法。我只实现了
\uuult\uuuuu
作为示例,但在其余部分(这也是用于排序的部分)中应该直接实现这一点,啊,我明白了。你能告诉我最后两种方法是什么吗?我想我没见过他们before@user11610667它们都用于将对象转换为字符串。大多数情况下,这是印刷所必需的。然而,
str
的目标是使对象具有可读性,而
repr
则更侧重于生成对象的唯一表示(因此其python
id()
和类也可能出现)。这两种方法在日志记录和调试中都非常有用-阅读更多内容非常感谢!这真的很彻底,也很有帮助。另外,如果值在
\uu lt\uu
方法中相同,而在其他任何地方都不相同,那么为什么要区分比较键呢?@user11610667这个想法是为了向您展示可以覆盖的最重要的方法。我只实现了
\uuult\uuuuu
作为示例,但在其余部分(这也是用于排序的部分)中应该直接实现这一点,啊,我明白了。你能告诉我最后两种方法是什么吗?我想我没见过他们before@user11610667它们都用于将对象转换为字符串。大多数情况下,这是印刷所必需的。然而,
str
的目标是使对象具有可读性,而
repr
则更侧重于生成对象的唯一表示(因此其python
id()
和类也可能出现)。这两者在日志记录和调试中都非常有用-阅读更多
    def __lt__(self, other: "Pair"):
        if self.value != other.value:
            return self.value < other.value

        return self.key < other.key
# 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)]