Python中类似字典的数据结构,其中键是两个值?
我在找一种在Python中类似于字典的数据结构。不同的是,它有两个键。我希望能够在常量时间内访问到值。
dict.get(dog, smurf)
{(dog, smurf): 40}
这可能吗?
如果没有这种结构,我可以用字典里面再放一个字典。但上面的方式会更方便。
{dog: {(smurf: 40)}}
4 个回答
3
如果我没有理解错的话,你可以用一个普通的字典索引来使用元组。如果字典的键都是可以哈希的,那么这个(不可变的)元组也是可以哈希的,可以用作字典的键。
>>> d = {('dog', 'smurf'): 123}
>>> d[('dog', 'smurf')]
123
>>> d.get(('dog', 'smurf'))
123
如果你真的想在使用d.get
的时候不想加重复的括号,你可以从dict
继承,并重写get
方法和/或__getitem__
,这样就可以使用元组的打包和解包。不过如果没有特别好的理由,最好不要这样做。
4
我不太明白你的例子。你是指像这样吗?
>>> 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'
13
是什么在阻止你呢?
d = {(dog, smurf): 40}
print d[(dog, smurf)] # 40