Значение кортежа по ключу
Возможно ли получить значение из кортежа:
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, возможно, будет путь.