如何使用字典作为Python中字典的键

时间:2012-08-21 18:44:36

标签: 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}}形式的字典。

非常感谢任何帮助。

亲切的问候 -

专利

5 个答案:

答案 0 :(得分:2)

字典的键必须是可清洗的项目;不幸的是,字典本身并不是可以清洗的(它们是可变的,它们使它们不能被清洗)。

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

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

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

答案 1 :(得分:1)

字典只能使用 hashable 对象作为键,这意味着它们必须是 immutable 。默认字典也不是,所以这不起作用。你可以试试frozendict

答案 2 :(得分:1)

Python wiki

  

要用作字典键,对象必须支持散列函数(例如通过__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已经说过的话。就使用字典(或列表等)作为字典键而言,你运气不佳。

答案 3 :(得分:1)

dict不能用作密钥,因为它是不可删除的。

hash(a)

所以我会重新考虑你的问题,或者如果你真的需要哈希一个dict,你可以代表一个字符串,或者元组和哈希:

hash(tuple(dict.items()))
hash(''.join(["%s%s" %(k, v) for k,v in dict.items()]))

答案 4 :(得分: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 )