如何使用字典作为Python中字典的键
所有- 今天我有一个非常基本的问题。。。但这一直阻碍着我在编程中取得更大的成效,所以我将其发布在这里 我想创建一个以字典为键的字典。大概我只能把字典的引用作为键传递给你。。。只是我不知道用Python怎么做。以下是我尝试做的一个玩具简化:如何使用字典作为Python中字典的键,python,reference,dictionary,Python,Reference,Dictionary,所有- 今天我有一个非常基本的问题。。。但这一直阻碍着我在编程中取得更大的成效,所以我将其发布在这里 我想创建一个以字典为键的字典。大概我只能把字典的引用作为键传递给你。。。只是我不知道用Python怎么做。以下是我尝试做的一个玩具简化: def test( dict ): a={} b={1:1} a[ dict ] = b return a a = {0:0} print test( a ) 我希望b是一本形式为{{0:0}:{1:1}的字典 非常感谢您
def test( dict ):
a={}
b={1:1}
a[ dict ] = b
return a
a = {0:0}
print test( a )
我希望b是一本形式为{{0:0}:{1:1}的字典
非常感谢您的帮助
亲切问候-
字典的Pat键必须是可散列项;不幸的是,字典本身是不可散列的(它们是可变的,这使它们不具备散列的资格)
使用它们的项列表(转换为排序元组):
a[tuple(sorted(dct.items()))] = b
可变对象是不可散列的,因为它们可以就地更改,导致以后的键查找失败。例如,如果从用作键的字典中添加或删除项,则预期结果会是什么?字典只能将哈希对象用作键,这意味着它们必须是不可变的。默认字典也不是,因此无法使用。不过你可以试试。:
要用作字典键,对象必须支持哈希函数(例如通过_哈希函数)、相等比较(例如通过_eq或_cmp函数),并且必须满足上述正确性条件
因此,尝试一下:
a = {0: 0}
hash(a)
产生以下错误:
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
hash(a)
TypeError: unhashable type: 'dict'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
散列(a)
TypeError:无法损坏的类型:“dict”
基本上只是证实了mgilson已经说过的话。如果将字典(或列表等)用作字典键,则运气不佳。dict不能用作键,因为它不易损坏
hash(a)
def get_key( dict1, dict2 ):
list = dict1.items() + dict2.items()
list.sort()
return tuple( list )
a,b = {'feature1':0}, {'feature1':1}
print get_key( a, b )
所以我会重新考虑你的问题,或者如果你真的需要散列一个dict,你可以表示为一个字符串,或者元组和散列:
hash(tuple(dict.items()))
hash(''.join(["%s%s" %(k, v) for k,v in dict.items()]))
感谢所有回复的人。我知道这是一个相当基本的问题,所有关于哈希性和可变性的信息都非常感谢 我确实将采用将输入向量(字典本身)映射到其项的排序元组的方法。它明确地描述了给定字典的特征,是一种可散列的数据结构,因此可以将其用作字典键
def get_key( dict1, dict2 ):
list = dict1.items() + dict2.items()
list.sort()
return tuple( list )
a,b = {'feature1':0}, {'feature1':1}
print get_key( a, b )
你能解释一下用例吗?为什么您需要一个字典作为键?为什么不使用列表或元组?@Rapptz--也不能使用
list
。请参阅有关用例的信息:我的字典是特征向量,我想在字典中存储两个特征向量之间的距离:距离[vector1][vector2]=…遗憾的是,这不能完全按照要求工作,因为dct.items()
的顺序可能不同,从而导致索引错误。@nightcracker:在大多数情况下,同一组键/值对的顺序将以相同的顺序返回。如果您插入,然后删除很多键,然后再次插入,您可能会失去排序,因此我将添加一些排序。考虑到排序的复杂性(而散列每个元素只需要O(n)
),并且要求元素是可排序的,因此排序不足以解决此问题(除了可散列之外,这是一个不必要的要求)。请参阅我在回答中链接的frozendict实现。@nightcracker:一般来说,使用dict
作为密钥首先是可疑的,需要重新思考。我的回答的其余部分(为什么不起作用)在任何情况下,对大局来说都更为重要。@Martin Pieters:为什么首先要将dict作为一个关键嫌疑犯使用?在我看来,我上面的评论中概述的用例是一个完全有效的用例。其他编程语言(例如Perl)可以让您毫不费力地做到这一点。尽管这两个问题都可以解决,正如所写的:(1)dict.items()。