2010-04-19 128 views
7

我想创建一个按列表进行索引的字典。例如,我的字典应该看起来像:在python中创建一个按列表索引的字典

D = {[1,2,3]:1, [2,3]:3} 

任何人都知道如何做到这一点?如果我只输入D([1,2,3]) = 1它会返回一个错误。

+10

这是不可能的,字典键需要是不可变的。改为使用元组。 – SilentGhost 2010-04-19 22:00:14

+0

那么我该怎么做? D((1,2,3))= 1也会返回错误。 – Chris 2010-04-19 22:10:45

+0

当你打算使用'[...]'时,看起来你正在使用'(...)'。 'D [1,2,3] = 1'应该可以正常工作。 – 2010-04-19 22:13:26

回答

17

字典密钥必须哈希的,该名单并非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 
+0

您的意思是第一句中的字典键,而不是元组键。 – 2010-04-19 22:11:14

+0

当然。谢谢。 – 2010-04-19 22:12:30

+0

“试图保留一个字典”=>“试着保持一个字典有效” – doublep 2010-04-19 22:13:33

2

字典键只能是可哈希对象。 如果你想列表的内容作为一个键,你可以将列表转换为元组。

>>>d={} 
>>>a = tuple((1,2)) 
>>>a 
(1, 2) 
>>>d[a] = 3 
>>>print d 
{(1, 2): 3} 
+3

键必须是* hashable *,不一定*不可变*。你可以使用可变值(尽管它很少有用)和不可变的不可变值(例如,包含不可取值的元组)。 – 2010-04-19 22:12:39

+0

感谢评论,尽管是同样的东西......你能给出一个可变和可拆分的例子? – joaquin 2010-04-19 22:17:09

+2

对于一个对象是一个合理的可散列对象,当你使用它的散列并进行平等比较时,它的答案永远不会改变。实际的对象可能能够以其他方式改变。例如,如果我有一个用于定义人的类Person,我可以使用身份比较来查找两个Person对象是否相等,无论我是否改变有关Person的东西,比如他们的年龄或地址。如果可变性不影响相等和散列的计算,则不会阻止对象被哈希化。 – 2010-04-19 22:37:14

1
d = {repr([1,2,3]): 'value'} 

{'[1, 2, 3]': 'value'} 

别人(see also here)正如所解释的,你不能直接使用的列表。但是,如果您确实想使用您的列表,则可以使用其字符串表示形式。

相关问题