如何使用字典作为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}的字典 非常感谢您

所有-

今天我有一个非常基本的问题。。。但这一直阻碍着我在编程中取得更大的成效,所以我将其发布在这里

我想创建一个以字典为键的字典。大概我只能把字典的引用作为键传递给你。。。只是我不知道用Python怎么做。以下是我尝试做的一个玩具简化:

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()。