2012-01-04 11 views
19

E 'possibile ottenere il valore di tuple:valore Tuple a chiave

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

chiamando tasto STR come P

Python dice che solo int può essere utilizzato per questo tipo di 'query'

Non riesco a utilizzare il ciclo (troppo sovraccarico ...)

Grazie!

+3

Non c'è altro modo che eseguire il ciclo in sequenza finché non si trova la chiave con una struttura dati come questa. Se non lo vuoi, allora hai bisogno di una mappatura (in Python usa una tabella hash per la ricerca a tempo costante). Puoi facilmente trasformarlo in un 'dict 'dicendo' dict (TUPLE) '. –

+0

['namedtuple'] (http://docs.python.org/library/collections.html#collections.namedtuple) può essere utilizzato per questo. Vedi la risposta di Eduardo e la mia elaborazione. – cod3monk3y

risposta

35

La struttura dei dati canonica per questo tipo di query è un dizionario:

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

In [2]: d = dict(t) 

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

Se si utilizza una tupla, non v'è alcun modo per evitare il loop (esplicito o implicito).

+0

Non importa a lungo giorno ... – Mission

7

Si desidera utilizzare un dizionario.

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

E poi si può accedere alla chiave in questo modo:

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

Invece di passare a pieni dizionari è possibile provare a utilizzare un named tuple invece. Maggiori informazioni su this question.

Fondamentalmente si definiscono i tag per i campi e quindi sono in grado di fare riferimento a loro come value.tag1, ecc

Citando la documentazione:

casi tuple denominate non hanno per-esempio dizionari , quindi sono leggeri e non richiedono più memoria rispetto alle tuple normali.

3

Elaborare la risposta di Eduardo con un codice dalla shell 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') 

Ricordare che le tuple sono immutabili e che i dizionari sono modificabili. Se vuoi tipi immutabili, namedtuple potrebbe essere la strada da percorrere.

4

dict(TUPLE)[key] farà quello che vuoi.

C'è un po 'di memoria in testa, ma è veloce.

+0

Riesci a pensare a un modo per farlo con più chiavi? Per esempio. se il codice originale era 'foo, bar = TUPLE', c'è un modo idiomatico di decomprimere un' namedtuple' in più variabili basate sui tasti? Questo è ovviamente errato ma qualcosa come 'foo, bar = dict (TUPLE) [" foo "," bar "]' – meowsqueak