2012-01-04 17 views
19

¿Es posible obtener el valor de la tupla:valor Tupla por la clave

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

llamando clave STR como P

Python dice que sólo int puede ser utilizado para este tipo de 'consulta'

No puedo usar el bucle (demasiada sobrecarga ...)

¡Gracias!

+3

No hay otra manera que bucle secuencialmente hasta que encuentre la clave con una estructura de datos como esta. Si no quieres eso, entonces necesitas una asignación (en Python usa una tabla hash para búsqueda constante). Puede convertir esto fácilmente en un 'dict' diciendo' dict (TUPLE) '. –

+0

['namedtuple'] (http://docs.python.org/library/collections.html#collections.namedtuple) se puede usar para esto. Vea la respuesta de Eduardo y mi elaboración. – cod3monk3y

Respuesta

35

La estructura de datos canónico para este tipo de consultas es un diccionario:

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

In [2]: d = dict(t) 

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

Si utiliza una tupla, no hay manera de evitar un bucle (explícita o implícita).

+0

No importa el día largo ... – Mission

7

En su lugar, desea utilizar un diccionario.

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

Y entonces se puede acceder a la clave de este modo:

d['P'] # Gets 'Shtg1' 
6

En lugar de mover a los diccionarios completos puede intentar usar un named tuple lugar. Más información en this question.

Básicamente se definen las etiquetas para los campos y luego son capaces de referirse a ellos como value.tag1, etc.

Citando la documentación:

instancias con nombre de tupla no tienen diccionarios por instancia , por lo que son livianos y no requieren más memoria que las tuplas normales.

3

Para elaborar sobre la respuesta de Eduardo con algún código del shell de 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') 

Recuerde que las tuplas son inmutables, y los diccionarios son mutables. Si desea tipos inmutables, namedtuple podría ser el camino a seguir.

4

dict(TUPLE)[key] hará lo que quiera.

Hay un poco de memoria por encima, pero es rápido.

+0

¿Puedes pensar en una forma de hacerlo con varias teclas? P.ej. si el código original era 'foo, bar = TUPLE', ¿hay una forma idiomática de descomprimir' namedtuple' en múltiples variables basadas en claves? Esto es obviamente incorrecto, pero algo como 'foo, bar = dict (TUPLE) [" foo "," bar "]' – meowsqueak

Cuestiones relacionadas