全部 -
我今天有一个非常基本的问题......但它一直妨碍我在编程中高效地继续前进,所以我在这里发帖。
我想创建一个以字典为键的字典。据推测,我只能将对字典的引用作为键传递...只是我不知道如何在Python中执行此操作。这是我想要做的玩具减少:
def test( dict ):
a={}
b={1:1}
a[ dict ] = b
return a
a = {0:0}
print test( a )
我希望b成为{{0:0}:{1:1}}形式的字典。
非常感谢任何帮助。
亲切的问候 -
专利
答案 0 :(得分:2)
字典的键必须是可清洗的项目;不幸的是,字典本身并不是可以清洗的(它们是可变的,它们使它们不能被清洗)。
使用他们的项目列表,转换为已排序的元组,而不是:
a[tuple(sorted(dct.items()))] = b
可变对象不可清除,因为它们可以就地更改,从而使以后的键查找失败。如果您从用作键的字典中添加或删除项目,预期结果是什么?例如?
答案 1 :(得分:1)
字典只能使用 hashable 对象作为键,这意味着它们必须是 immutable 。默认字典也不是,所以这不起作用。你可以试试frozendict。
答案 2 :(得分: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已经说过的话。就使用字典(或列表等)作为字典键而言,你运气不佳。
答案 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 )