Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中可散列的灵活标识符_Python_Dictionary_Hash_Immutability - Fatal编程技术网

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

我试图在python中创建某种可哈希的标识符;我需要它来识别图中的节点。问题在于有些节点具有不同的属性。如果这些节点的属性由属性到值的字典描述:

idA = {'type':'A', 'name':'a_100'}
idB = {'type':'B', 'name':'b_3', 'value':7}
我希望
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

字典是实现这一点的理想选择,因为我将相当频繁地检查这些属性,字典查找应该是高效的(我使用了许多标识符,每个标识符都有许多属性)。但字典是不可散列的

元组对的冻结集可以正确地散列,但它对查找有效吗

如果我声明一个空类,然后为它设置属性,这就是我想要的(可能在后台使用字典),但我不知道如何散列它。也许有某种方法可以使用
inspect
dir()
散列它的成员值

如果有一种方法可以基于(属性、值)的元组对使用散列(and==运算符),那么这也可以满足我的需要

或者是否有一些解决方法可以使等效的数据类型满足SAT类型的类比:
frozenset
is to
set
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
的内容,您试图优化的具体用例是什么?我有一个这些标识符的图表。我经常查找这些标识符的属性值。我还将我会经常散列标识符,因为