当前位置: 首页 > 面试题库 >

自定义类型的对象作为字典键

贺华容
2023-03-14
问题内容

我必须怎么做才能将自定义类型的对象用作Python字典中的键(我不希望“对象id”用作键),例如

class MyThing:
    def __init__(self,name,location,length):
            self.name = name
            self.location = location
            self.length = length

如果名称和位置相同,我想将MyThing用作相同的键。从C#/
Java开始,我习惯于重写并提供一个equals和hashcode方法,并保证不会突变该hashcode依赖的任何内容。

我必须在Python中做什么才能完成此任务?我应该吗?

(在一个简单的例子中,就像这里一样,也许最好将一个(名称,位置)元组作为键-但考虑到我希望键成为一个对象)


问题答案:

您需要添加2种方法,注意__hash____eq__

class MyThing:
    def __init__(self,name,location,length):
        self.name = name
        self.location = location
        self.length = length

    def __hash__(self):
        return hash((self.name, self.location))

    def __eq__(self, other):
        return (self.name, self.location) == (other.name, other.location)

    def __ne__(self, other):
        # Not strictly necessary, but to avoid having both x==y and x!=y
        # True at the same time
        return not(self == other)

Python dict文档对关键对象定义了这些要求,即它们必须是可哈希的。



 类似资料:
  • 想给方法自定义数据类型,通过资料查到可以用 dataclass 这样就很简洁,但貌似传入必须是实例化的方式,我更希望是字典的形式,请问有什么简洁的好的方法?

  • 下面的代码没有给我正确的答案。 这给出; 一般来说,若给定了点的数组列表,我们如何在数组中找到特定点的索引?

  • 我创建了一个简单的类型: 现在我想初始化一个已经声明的变量(当前值=0),其结果为 现在,TypeScript告诉我,类型号不能赋给CustomType类型,即使初始化应该工作,只要数字是0、1、2、3、4或5的整数。: TS2322:类型“number”不能赋给类型“CustomType”。 不幸的是,到目前为止,我没有找到任何解决方案。转换为标准类型很好,但我不确定如何使我的自定义类型接受一个

  • 我得到一个错误: 我确信这是一个已知的范例,因为它似乎是一个非常常见的层次类使用问题(自引用类)。我知道我可以将

  • 问题内容: 您是否知道是否有内置函数可以从任意对象构建字典?我想做这样的事情: 注意:它不应包含方法。仅字段。 问题答案: 请注意,Python 2.7中的最佳实践是使用新型类(Python 3不需要),即 同样,“对象”和“类”之间也存在差异。要从任意对象构建字典,只需使用即可。通常,您将在类级别声明方法,并在实例级别声明属性,因此应该没问题。例如: 更好的方法(由robert建议在注释中使用)

  • Rust 自定义数据类型主要是通过下面这两个关键字来创建: struct: 定义一个结构体 enum: 定义一个枚举类型 而常量的创建可以通过 const 和 static 关键字来创建。