Значение кортежа по ключу

Возможно ли получить значение из кортежа:

TUPLE = (
    ('P', 'Shtg1'),
    ('R', u'Shtg2'),
    ('D', 'Shtg3'),
)

вызвав клавишу STR как P

Python говорит, что для этого типа запроса можно использовать только int.

Я не могу использовать loop (слишком много служебных данных...)

Спасибо!

Ответ 1

Каноническая структура данных для этого типа запросов - это словарь:

In [1]: t = (
   ...:     ('P', 'Shtg1'),
   ...:     ('R', u'Shtg2'),
   ...:     ('D', 'Shtg3'),
   ...: )

In [2]: d = dict(t)

In [3]: d['P']
Out[3]: 'Shtg1'

Если вы используете кортеж, невозможно избежать цикла (явного или неявного).

Ответ 2

Вместо этого вы хотите использовать словарь.

d = { 'P': 'Shtg1', 'R': u'Shtg2', 'D':'Shtg3' }

И тогда вы можете получить доступ к ключу следующим образом:

d['P'] # Gets 'Shtg1'

Ответ 3

Вместо того, чтобы переходить к полным словарям, вы можете вместо этого использовать named tuple. Дополнительная информация в этом вопросе.

В основном вы определяете теги для полей, а затем можете ссылаться на них как на value.tag1 и т.д.

Цитирование документов:

Именованные экземпляры кортежей не имеют словарей для каждого экземпляра, поэтому они являются легкими и требуют больше памяти, чем обычные кортежи.

Ответ 4

dict(TUPLE)[key] сделает то, что вы хотите.

Накладная часть памяти немного, но она быстро.

Ответ 5

Чтобы разработать ответ Эдуардо с некоторым кодом из оболочки python.

>>> from collections import namedtuple
>>> MyType = namedtuple('MyType', ['P', 'R', 'D'])
>>> TUPLE = MyType(P='Shtg1', R=u'Shtg2', D='Shtg3')
>>> TUPLE
MyType(P='Shtg1', R=u'Shtg2', D='Shtg3')

>>> TUPLE.P
'Shtg1'

>>> TUPLE.R
u'Shtg2'

>>> TUPLE.D
'Shtg3'

>>> TUPLE[0:]
('Shtg1', u'Shtg2', 'Shtg3')

Помните, что кортежи неизменяемы, а словари изменяемы. Если вы хотите неизменные типы, namedtuple, возможно, будет путь.