如何使我的 class 与 Python 具有可比性?
How do I make my class comparable in Python?
我有一个 Pair class(它有一个键和一个值),我正在尝试编写一个程序来创建一堆 Pair 对象,将它们添加到列表中,然后执行 stable quicksort 在他们身上。但是,我似乎无法弄清楚如何使对象具有可比性,以便程序在两个对象具有相同值时自动比较它们的键。在 Java 中很容易做到这一点,但我只是不明白我应该如何在 Python 中做同样的事情。
提前致谢!
class Pair(Generic[K,V]):
def __init__(self, key: K, val: V):
self.key = key
self.value = val
Python 为此使用所谓的“dunder 方法”(双下划线方法)。您已经在使用 init dunder 方法。定义 __eq__
。
编辑:见优秀dbader article
以下如何(可按键排序的配对,但您可以轻松定义任何其他排序方式):
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)]
要按值排序,如果值相等则按键排序,您可以 dp 类似:
def __lt__(self, other: "Pair"):
if self.value != other.value:
return self.value < other.value
return self.key < other.key
示例 input/output 与上述 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__
。有关更多运算符,请参阅 here
我有一个 Pair class(它有一个键和一个值),我正在尝试编写一个程序来创建一堆 Pair 对象,将它们添加到列表中,然后执行 stable quicksort 在他们身上。但是,我似乎无法弄清楚如何使对象具有可比性,以便程序在两个对象具有相同值时自动比较它们的键。在 Java 中很容易做到这一点,但我只是不明白我应该如何在 Python 中做同样的事情。
提前致谢!
class Pair(Generic[K,V]):
def __init__(self, key: K, val: V):
self.key = key
self.value = val
Python 为此使用所谓的“dunder 方法”(双下划线方法)。您已经在使用 init dunder 方法。定义 __eq__
。
编辑:见优秀dbader article
以下如何(可按键排序的配对,但您可以轻松定义任何其他排序方式):
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)]
要按值排序,如果值相等则按键排序,您可以 dp 类似:
def __lt__(self, other: "Pair"):
if self.value != other.value:
return self.value < other.value
return self.key < other.key
示例 input/output 与上述 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__
。有关更多运算符,请参阅 here