我正在尝试在python中制作某种可用的标识符;我需要它来识别图中的节点。麻烦的是一些节点具有不同的属性。如果属性的字典将这些节点的属性描绘为值:
idA = {'type':'A', 'name':'a_100'}
idB = {'type':'B', 'name':'b_3', 'value':7}
我希望__hash__()
和__eq__()
使用元组对((key1,value1), (key2,value2), ...)
。
字典对此非常理想,因为我要经常检查这些属性,字典查找应该是有效的(我使用了很多标识符,每个都有很多属性)。但字典不可用。
元组对的冻结集会正确散列,但查找效率是否高效?
如果我声明一个空类,然后为它设置属性,那就做我想要的(可能使用引擎盖下的字典),但我不知道如何散列它。也许有一些方法可以使用inspect
或dir()
对其成员值进行哈希?
class identifier():
pass
idA = identifier()
idA.type = 'A'
idA.name = 'a_100'
如果有一种方法可以使用基于(属性,值)的元组对的散列(和==运算符),那么这也可以做我想要的。
或者是否有一些解决方法可以使等效数据类型满足此SAT类型的类比:frozenset
是set
为?是dict
感谢您的帮助。
编辑:
这是正确的方向吗?
class identifier(dict):
def to_frozenset(self):
return frozenset([(k,self[k]) for k in self])
def __hash__(self):
return hash(self.to_frozenset())
def __eq__(self, rhs):
return self.to_frozenset() == rhs.to_frozenset()
def __ne__(self, rhs):
return not self == rhs
这改变了计算复杂度,因此查找标识符属性的速度很快,但是对标识符进行散列或检查两个标识符是否相等是很慢的。如果有一种方法可以缓存其哈希值(并且在缓存哈希值时禁止其字典更改),并且我们保证很少有标识符类型的哈希冲突(因此检查相等性很少),那么这可能是一个很好的解决方案?让我知道你的想法!
答案 0 :(得分:2)
没有frozendict
。但是collections.namedtuple
是可能适合您的行为的近似值。
答案 1 :(得分:1)
不要从dict继承,封装它。这样你就可以确保它不会被改变。
至于缓存,您可以记住to_frozenset或其哈希值。根据使用模式,记住散列,它允许您快速返回散列和不等式,并仅在散列匹配时比较frozensets。
也就是说,对于尚未编制基准的人来说,你太担心了。构建最简单的实现。如果它很快就完成了。否则,对其进行基准测试,然后找到一种改进测量结果的增量方法。
答案 2 :(得分:1)
我不确定这会解决您的问题,但是如果您想要一个对象可以清洗,您可以这种方式实现它:
class Hashable(object):
def __hash__(self):
return hash((self.__class__.__name__,
tuple(self.__dict__.items())))
您将以结构化元组格式获取对象的数据,并将类名称作为某个国王的哈希签名。您甚至可以扩展dict
以在此课程中使用。