Python:可以将自定义类用作字典的键吗? [重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python:可以将自定义类用作字典的键吗? [重复]相关的知识,希望对你有一定的参考价值。

假设我们有一个这样的自定义节点类:

class Node:
    def __init__(self, val, next, random):
        self.val = val
        self.next = next
        self.random = random

节点对象可以用作字典的键吗?我的理解是,对象应具有可变性和可哈希性,以使其有资格用作字典键,因为可变对象会导致哈希值变化,但该对象是可变的,因此不应用作键。可以将自定义可变类用作字典的键吗?答案似乎是肯定的,所以正确的问题是如何?

答案

this线程上的答案帮助我了解了它的工作原理。

这里的想法是确保您的自定义对象实现哈希和相等方法。

Equal方法应以始终将两个逻辑等效对象视为相等的方式实现。对于此处给定的Node对象,如果两个节点的所有属性都相同,则将其视为相等。因此,我们可以构建一个包含所有属性的元组的键。之所以可行,是因为元组是不可变的,因此我们基本上是在创建一个包含该对象所有属性的不可变对象,并将使用它来计算哈希。

以下实现确保两个逻辑等效的节点(具有相同的属性)具有相同的密钥,因此将为两个相等的节点生成相同的哈希值。

class Node:
    def __init__(self, val, next, random):
        self.val = val
        self.next = next
        self.random = random

    def __key(self):
        return (self.val, self.next, self.random)

    def __hash__(self):
        return hash(self.__key())

    def __eq__(self, other):
        if isinstance(other, Node):
            return self.__key() == other.__key()
        return NotImplemented

[请注意,如果节点的任何属性发生更改,则它基本上会变成其他节点,并且很可能会导致不同的哈希值。我说的可能性最大,因为两个不同的节点最终可能具有相同的哈希值,所以这种现象称为哈希冲突。上面引用的链接具有相同的更多信息。

以上是关于Python:可以将自定义类用作字典的键吗? [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中,我可以使用元组作为字典中的键吗?

数组可以用作 HashMap 键吗?

我可以使用对象(类的实例)作为 Python 中的字典键吗?

python类型-集合

如何重命名字典列表中深度嵌套的键(Python 3)?

python字典日期时间作为键,keyError