python中可清晰,灵活的标识符

时间:2010-11-17 22:20:37

标签: python dictionary hash immutability

我正在尝试在python中制作某种可用的标识符;我需要它来识别图中的节点。麻烦的是一些节点具有不同的属性。如果属性的字典将这些节点的属性描绘为值:

idA = {'type':'A', 'name':'a_100'}
idB = {'type':'B', 'name':'b_3', 'value':7}

我希望__hash__()__eq__()使用元组对((key1,value1), (key2,value2), ...)

字典对此非常理想,因为我要经常检查这些属性,字典查找应该是有效的(我使用了很多标识符,每个都有很多属性)。但字典不可用。

元组对的冻结集会正确散列,但查找效率是否高效?

如果我声明一个空类,然后为它设置属性,那就做我想要的(可能使用引擎盖下的字典),但我不知道如何散列它。也许有一些方法可以使用inspectdir()对其成员值进行哈希?

class identifier():
    pass
idA = identifier()
idA.type = 'A'
idA.name = 'a_100'

如果有一种方法可以使用基于(属性,值)的元组对的散列(和==运算符),那么这也可以做我想要的。

或者是否有一些解决方法可以使等效数据类型满足此SAT类型的类比:frozensetset为?是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

这改变了计算复杂度,因此查找标识符属性的速度很快,但是对标识符进行散列或检查两个标识符是否相等是很慢的。如果有一种方法可以缓存其哈希值(并且在缓存哈希值时禁止其字典更改),并且我们保证很少有标识符类型的哈希冲突(因此检查相等性很少),那么这可能是一个很好的解决方案?让我知道你的想法!

3 个答案:

答案 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以在此课程中使用。