Python数据结构类似于字典,其中键是两个值?

时间:2012-01-23 04:23:13

标签: python dictionary

我在Python中寻找类似于字典的数据结构。不同之处在于有两个键。我希望能够在恒定时间内访问该值。 像:

dict.get(dog, smurf)
{(dog, smurf): 40}

这可能吗?

如果这不存在,我只会在字典中做一本字典。但是,上面会更方便。

{dog: {(smurf: 40)}}

4 个答案:

答案 0 :(得分:13)

什么阻止了你?

d = {(dog, smurf): 40}
print d[(dog, smurf)] # 40

答案 1 :(得分:3)

除非我误解了某些内容,否则你可以使用正常的dict索引与元组。如果密钥都是可清除的,则(不可变的)元组将是可清除的,并且可以用作dict密钥。

>>> d = {('dog', 'smurf'): 123}
>>> d[('dog', 'smurf')]
123
>>> d.get(('dog', 'smurf'))
123

如果确实希望在没有重复括号的情况下使用d.get,则继承dict并覆盖get方法和/或{{1} ,使用元组打包/解包。但如果你不需要这么做,就不要这样做。

答案 2 :(得分:3)

我不太明白你的例子。你的意思是这样的吗?

>>> dog = 'dog'
>>> smurf = 'smurf'
>>> d = {(dog, smurf): 40}
>>> d[(dog, smurf)]
40

元组是不可变的,如果它们包含的对象也是不可变的,那么它们也可以用作字典键。

但是如果你将一个可变对象分配给dog,它将不起作用:

>>> dog = ['d', 'o', 'g']
>>> d[(dog, smurf)]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

答案 3 :(得分:3)

你不需要parens:

>>> d = {}
>>> d['jim', 'joe'] = 7
>>> d['jim', 'joe']
7
>>> d
{('jim', 'joe'): 7}

Puples不是由parens表示的。它们用逗号表示。有时只需要消除歧义。