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

3 投票
4 回答
2593 浏览
提问于 2025-04-17 10:52

我在找一种在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

撰写回答