Структура данных Python похожа на словарь, где ключ это два значения? - PullRequest
2 голосов
/ 23 января 2012

Я ищу структуру данных в Python, которая похожа на словарь. Разница в том, что есть два ключа. Я хочу иметь возможность получить доступ к значению в постоянное время. Как:

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

Возможно ли это?

Если бы этого не было, я бы просто сделал словарь в словаре. Но вышесказанное было бы удобнее.

{dog: {(smurf: 40)}}

Ответы [ 4 ]

13 голосов
/ 23 января 2012

Что вам мешает?

d = {(dog, smurf): 40}
print d[(dog, smurf)] # 40
3 голосов
/ 23 января 2012

Вам не нужны парены:

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

Кортежи не обозначены паренами.Они обозначены запятой.Парены нужны только для устранения неоднозначности.

3 голосов
/ 23 января 2012

Я не совсем понимаю ваш пример. Вы имеете в виду что-то вроде этого?

>>> 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 голосов
/ 23 января 2012

Если я что-то не так понимаю, вы можете использовать обычную индексацию dict с кортежем. Если оба ключа являются хэшируемыми, то (неизменяемый) кортеж будет хэшируемым и может использоваться в качестве ключа.

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

Если вы действительно хотите использовать d.get без дублированных скобок, то наследуйте от dict и переопределите метод get и / или __getitem__, чтобы использовать упаковку / распаковку кортежей , Но не делайте этого, если вам не нужны веские причины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...