我想创建一个按列表进行索引的字典。例如,我的字典应该看起来像:在python中创建一个按列表索引的字典
D = {[1,2,3]:1, [2,3]:3}
任何人都知道如何做到这一点?如果我只输入D([1,2,3]) = 1
它会返回一个错误。
我想创建一个按列表进行索引的字典。例如,我的字典应该看起来像:在python中创建一个按列表索引的字典
D = {[1,2,3]:1, [2,3]:3}
任何人都知道如何做到这一点?如果我只输入D([1,2,3]) = 1
它会返回一个错误。
字典密钥必须哈希的,该名单并非becase的他们可变。您可以在完成后更改列表。想想当用作键的数据改变时,试图保留一个字典是多么棘手的问题;它没有任何意义。想象一下这个场景
>>> foo = [1, 2]
>>> bar = {foo: 3}
>>> foo.append(4)
你会明白为什么Python不会试图支持列表作为键。
最明显的解决方案是使用元组而不是列表作为关键字。
>>> d = {[1, 2, 3]: 1, [2, 3]: 3}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> d = {(1, 2, 3): 1, (2, 3): 3}
>>> d
{(2, 3): 3, (1, 2, 3): 1}
>>> d[2, 3]
3
您的意思是第一句中的字典键,而不是元组键。 – 2010-04-19 22:11:14
当然。谢谢。 – 2010-04-19 22:12:30
“试图保留一个字典”=>“试着保持一个字典有效” – doublep 2010-04-19 22:13:33
字典键只能是可哈希对象。 如果你想列表的内容作为一个键,你可以将列表转换为元组。
>>>d={}
>>>a = tuple((1,2))
>>>a
(1, 2)
>>>d[a] = 3
>>>print d
{(1, 2): 3}
键必须是* hashable *,不一定*不可变*。你可以使用可变值(尽管它很少有用)和不可变的不可变值(例如,包含不可取值的元组)。 – 2010-04-19 22:12:39
感谢评论,尽管是同样的东西......你能给出一个可变和可拆分的例子? – joaquin 2010-04-19 22:17:09
对于一个对象是一个合理的可散列对象,当你使用它的散列并进行平等比较时,它的答案永远不会改变。实际的对象可能能够以其他方式改变。例如,如果我有一个用于定义人的类Person,我可以使用身份比较来查找两个Person对象是否相等,无论我是否改变有关Person的东西,比如他们的年龄或地址。如果可变性不影响相等和散列的计算,则不会阻止对象被哈希化。 – 2010-04-19 22:37:14
d = {repr([1,2,3]): 'value'}
{'[1, 2, 3]': 'value'}
别人(see also here)正如所解释的,你不能直接使用的列表。但是,如果您确实想使用您的列表,则可以使用其字符串表示形式。
这是不可能的,字典键需要是不可变的。改为使用元组。 – SilentGhost 2010-04-19 22:00:14
那么我该怎么做? D((1,2,3))= 1也会返回错误。 – Chris 2010-04-19 22:10:45
当你打算使用'[...]'时,看起来你正在使用'(...)'。 'D [1,2,3] = 1'应该可以正常工作。 – 2010-04-19 22:13:26