2

全部 -

我今天有一个非常基本的问题......但它一直阻止我在我的编程中高效地前进,所以我把它贴在这里。

我想创建一个以字典为键的字典。大概我只能将字典的引用作为键传递......只是我不知道如何在 Python 中做到这一点。这是我正在尝试做的玩具减少:

def test( dict ):
    a={}
    b={1:1}
    a[ dict ] = b
    return a

a = {0:0}
print test( a ) 

我希望 b 成为 { {0:0} : {1:1} } 形式的字典。

对此的任何帮助都非常感谢。

亲切的问候 -

4

5 回答 5

2

字典的键必须是可散列项;不幸的是,字典本身不是可散列的(它们是可变的,这使它们失去了可散列的资格)。

使用他们的项目列表,转换为一个排序的元组,而不是:

a[tuple(sorted(dct.items()))] = b

可变对象不可散列,因为它们可以就地更改,导致以后的键查找失败。例如,如果您从用作键的字典中添加或删除项目,预期的结果会是什么?

于 2012-08-21T18:48:16.773 回答
1

字典只能使用可散列对象作为键,这意味着它们必须是不可变的。默认字典也不是,所以这不起作用。不过,您可以尝试使用frozendict

于 2012-08-21T18:48:33.520 回答
1

蟒蛇维基

要用作字典键,对象必须支持散列函数(例如通过__hash__)、相等比较(例如通过__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'

基本上只是确认 mgilson 已经说过的话。就使用字典(或列表等)作为字典键而言,您很不走运。

于 2012-08-21T18:50:10.897 回答
1

dict 不能用作密钥,因为它是不可散列的。

hash(a)

所以我会重新考虑你的问题,或者如果你真的需要散列一个你可以表示的字典是一个字符串,或者是元组和散列:

hash(tuple(dict.items()))
hash(''.join(["%s%s" %(k, v) for k,v in dict.items()]))
于 2012-08-21T18:53:17.970 回答
0

感谢所有回复的人。我知道这是一个相当基本的问题,非常感谢所有关于哈希性和可变性的信息。

我确实会追求将输入向量(字典本身)映射到其项目的排序元组的方法。这明确地表征了给定的字典,并且是一种可散列的数据结构,因此它可以用作字典键。

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 )
于 2012-08-22T16:30:28.077 回答