Python 如何在字典的元组中指定列表?

Python 如何在字典的元组中指定列表?,python,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', '

我对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:unhabable type:'list'

dict_of_lists_values = {}
a = [22, 39, 0]
b = [15, 38, 12]
dict[(a, b)] = 'please work'
基于我之前的实验,我认为如果我将列表转换为字符串,它会工作,但我希望它是列表而不是字符串


这是可能的吗?

Python中的字典只能有不可变/哈希键


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

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

否。不可能对字典键使用
列表类型。但是,您可以扩展
列表
,使其可散列,然后使用该新类型。(虽然有点麻烦。)


请注意下面斯文的评论。易变键是危险的,因为它们的散列在修改后会过时。

另外,如果标题令人困惑,很抱歉。.我试着想一想不那么令人困惑的标题(事实上,我只想到了这个,这表明这个问题是多么令人困惑:-)这失败了,因为元组的散列是由每个元素的散列组成的。我将回顾我关于python元组的书籍…感谢您的澄清..字符串是可散列的;名单上没有。伙计,我困了。倒过来。谢谢编辑Russell。这是一个非常糟糕的主意,因为当列表改变时哈希值也会改变。如果您使用可变字典键,请确保哈希值永远不会更改。@SvenMarnach如果列表更改,我们为什么不希望哈希值更改?这个问题似乎在寻找一个基于内容的密钥,而不是一个基于身份的密钥。还是我误解了你?这里有一个例子来说明这个问题。如果哈希值发生变化,dictionary对象将无法再找到键,因为它在哈希表中的位置是使用原始哈希值确定的。@SvenMarnach,很好。这确实是一个疏忽。
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!"
}