如何使我的类在Python中具有可比性?
我有一个Pair类(它有一个键和一个值),我试图制作一个程序,创建一组Pair对象,将它们添加到列表中,并对它们执行稳定快速排序。但是,我似乎不知道如何使对象具有可比性,以便程序在两个对象具有相同值时自动比较它们的键。在Java中实现这一点很容易,但我不知道如何在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
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
则更侧重于生成对象的唯一表示(因此其pythonid()
和类也可能出现)。这两种方法在日志记录和调试中都非常有用-阅读更多内容非常感谢!这真的很彻底,也很有帮助。另外,如果值在\uu lt\uu
方法中相同,而在其他任何地方都不相同,那么为什么要区分比较键呢?@user11610667这个想法是为了向您展示可以覆盖的最重要的方法。我只实现了\uuult\uuuuu
作为示例,但在其余部分(这也是用于排序的部分)中应该直接实现这一点,啊,我明白了。你能告诉我最后两种方法是什么吗?我想我没见过他们before@user11610667它们都用于将对象转换为字符串。大多数情况下,这是印刷所必需的。然而,str
的目标是使对象具有可读性,而repr
则更侧重于生成对象的唯一表示(因此其pythonid()
和类也可能出现)。这两者在日志记录和调试中都非常有用-阅读更多
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)]