python中可散列的灵活标识符
我试图在python中创建某种可哈希的标识符;我需要它来识别图中的节点。问题在于有些节点具有不同的属性。如果这些节点的属性由属性到值的字典描述:python中可散列的灵活标识符,python,dictionary,hash,immutability,Python,Dictionary,Hash,Immutability,我试图在python中创建某种可哈希的标识符;我需要它来识别图中的节点。问题在于有些节点具有不同的属性。如果这些节点的属性由属性到值的字典描述: idA = {'type':'A', 'name':'a_100'} idB = {'type':'B', 'name':'b_3', 'value':7} 我希望\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
idA = {'type':'A', 'name':'a_100'}
idB = {'type':'B', 'name':'b_3', 'value':7}
我希望\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
字典是实现这一点的理想选择,因为我将相当频繁地检查这些属性,字典查找应该是高效的(我使用了许多标识符,每个标识符都有许多属性)。但字典是不可散列的
元组对的冻结集可以正确地散列,但它对查找有效吗
如果我声明一个空类,然后为它设置属性,这就是我想要的(可能在后台使用字典),但我不知道如何散列它。也许有某种方法可以使用inspect
或dir()
散列它的成员值
如果有一种方法可以基于(属性、值)的元组对使用散列(and==运算符),那么这也可以满足我的需要
或者是否有一些解决方法可以使等效的数据类型满足SAT类型的类比:frozenset
is toset
as?是要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
这改变了计算复杂性,因此查找标识符属性很快,但散列标识符或检查两个标识符是否相等的速度很慢。如果有一种方法可以缓存它的散列(并且一旦缓存了散列,就不允许它的字典更改),并且我们可以保证标识符类型的散列冲突很少(因此很少检查是否相等),那么这可能是一个好的解决方案?让我知道你的想法 不要继承dict,封装它。这样你就可以确保它不会被改变
至于缓存,您可以记住\u frozenset或其散列。根据使用模式,记住散列,它允许您快速返回散列和不等式,并且仅在散列匹配时比较冻结集
也就是说,对于一个还没有编写基准测试的人来说,你太担心性能了。构建尽可能简单的实现。如果速度快,你就完成了。否则,对其进行基准测试,然后找到一种增量方法来改进测量结果。不要继承dict,而是封装它。这样你就可以确保它不会被改变
至于缓存,您可以记住\u frozenset或其散列。根据使用模式,记住散列,它允许您快速返回散列和不等式,并且仅在散列匹配时比较冻结集
也就是说,对于一个还没有编写基准测试的人来说,你太担心性能了。构建尽可能简单的实现。如果速度快,你就完成了。否则,对其进行基准测试,然后找到一种增量方法来改进测量结果。没有frozendict
。但是a是一种近似的行为,可能适合你。没有frozendict
。但是a是一种近似的行为,可能适合您。我不确定这是否解决了您的问题,但如果您希望对象是可散列的,可以用以下方式实现它:
class Hashable(object):
def __hash__(self):
return hash((self.__class__.__name__,
tuple(self.__dict__.items())))
您将获得结构化元组格式的对象数据,以及作为某个king的哈希签名的类名。您甚至可以扩展dict
,以便在该类中使用 我不确定这是否解决了您的问题,但如果您希望对象是可散列的,可以用以下方式实现它:
class Hashable(object):
def __hash__(self):
return hash((self.__class__.__name__,
tuple(self.__dict__.items())))
您将获得结构化元组格式的对象数据,以及作为某个king的哈希签名的类名。您甚至可以扩展dict
,以便在该类中使用 我不确定我是否理解这个问题。你是说你有一个节点
类,但它的不同实例有不同的属性吗?没错。有些节点属于“A”类型,有些节点属于“B”类型。类型“B”节点具有一些不同的属性。我还希望能够快速查找节点的属性(如“类型”),以便快速生成这些节点的子图(用于可视化图形)。我仍然不清楚您实际要做什么。暂时忽略所有关于\uuuuu hash\uuuu
和\uuuu eq\uuu
和frozenset
的内容,您试图优化的具体用例是什么?我有一个这些标识符的图表。我经常查找这些标识符的属性值。我还将经常散列标识符,因为这就是NetworkX(我正在使用的图形包)索引节点的方式。我已经知道我的图相当大(至少10000到100000个节点),所以缓慢的散列将是有害的。我还将经常查找属性,并且属性的数量不是很小(使用内置的id()
函数作为每个字典的散列,或者将它们全部放在一个列表中,并使用列表索引作为散列值。我不确定我是否理解这个问题。你是说你有一个节点
类,但它的不同实例具有不同的属性?没错。有些节点是“a”类型,有些是“B”类型。类型“B”nODE有一些不同的属性。我还希望能够快速查找节点的属性(如“类型”),以便快速生成这些节点的子图(用于可视化图形)。我仍然对您实际要做的事情感到困惑。暂时忽略所有关于\uuuuu hash\uuuuu
和\uuuu eq\uuuu
和frozenset
的内容,您试图优化的具体用例是什么?我有一个这些标识符的图表。我经常查找这些标识符的属性值。我还将我会经常散列标识符,因为