如何在字典中的元组中分配列表?

时间:2012-02-07 21:54:43

标签: python

我是python的新手并尝试了一些但是在列表中将列表用作字典键时遇到了麻烦。这是一个例子,应该更清楚:

dict_of_lists_values = {}
dict_of_lists_values[('dog', 'cat')] = 10
dict_of_lists_values[('dog1', 'cat1')] = 10
dict_of_lists_values[('dog1', 'cat2')] = 10
dict_of_lists_values
{('dog', 'cat'): 10, ('dog1', 'cat2'): 10, ('dog1', 'cat1'): 10}

这非常有效,并且允许我使用两个值作为字典中的键。当我尝试将其应用于列表时,出现错误:TypeError: unhashable type: 'list'

dict_of_lists_values = {}
a = [22, 39, 0]
b = [15, 38, 12]
dict[(a, b)] = 'please work'

根据我以前的实验,我认为如果我将列表转换为字符串它会起作用但我希望它像列表而不是字符串。

这可能吗?

3 个答案:

答案 0 :(得分:4)

在列表上调用tuple()以创建包含列表中元素的元组。

答案 1 :(得分:3)

没有。对词典键使用list类型是不可能的。但是,您可以扩展list,使其可以清除,然后使用该新类型。 (虽然这有点麻烦。)

class hlist(list):
    def __hash__(self):
        # Hash it somehow; here, I convert it to a hashable tuple ... and then hash it
        return hash(tuple(self))

l1 = hlist([1,2,3])
l2 = hlist([4,5,6])

d = {
    l1:"Hi.",
    l2:"Hello!"
}

请注意下面Sven的评论。可变密钥是危险的,因为如果它们被修改,它们的哈希就会变得陈旧。

答案 2 :(得分:1)

Python中的字典只能有不可变/可散列的密钥。

字符串,数字和元组是不可变的,因此它们可以用作字典键。实例具有唯一的__hash__(),因此也可以使用它们。但是列表是可变的,所以它们不能用作密钥。