如何获得字典键或等于给定对象的set元素?

问题描述 投票:-1回答:1

给出了Python中的字典d和键k,是否有一种有效的方法可以在d中查找等于k的键?

关于Python中的集合,可以问类似的问题:给定一个集合s和一个对象o,是否有一种有效的方法来获取等于e的元素s

目的是避免在内存中保留重复的不可变对象。

如果所讨论的键和元素是字符串,那么我想,可以通过interning(o)找到一些解决方法,但是对于任意不可变的可哈希对象是否有通用的解决方案?

作为用例,请考虑使用隐式图,其中顶点是可哈希的不可变数据结构(可能只是整数元组),它们用作字典键来保留一些关联的元数据。如果某个顶点在图形遍历中生成两次,并且需要存储在其他位置,则合理的做法是查找已使用的副本并将其存储两次,而不是存储新副本。一个更具体的示例是在用于解决15难题的A *最短路径算法中节省内存。

python dictionary hash set equality
1个回答
-2
投票

您的问题与sys.intern的概念密切相关。您问题的确切答案也是特定于实现的。我将为CPython回答它,但请记住,其他实现的行为也有所不同。

在CPython中,一旦创建(分配或使用)不可变的对象,就会在内存中创建它。每个具有相同值的不可变对象都指向相同的对象(!)。您可以使用sys.intern函数(在CPython中为对象的内存地址)进行检查。

例如:

mutable and immutable objects

即使我将一个构造或计算的不可变对象分配给一个变量,它也与另一个具有相同值的变量是相同的对象(id)。

id

返回您的问题:

有没有一种有效的方法来查找d中等于k的键?

您不必这样做。 CPython会为您解决这个问题。集合中的不可变对象也是如此。

对于任意不可变的可哈希对象是否有通用解决方案?

请注意,不可变的对象也可以具有哈希值!默认情况下,所有内置的不可变对象都具有哈希,而可变对象则没有,但是用户可以定义具有自己的哈希函数的类。从而创建可变和可哈希对象。

© www.soinside.com 2019 - 2024. All rights reserved.