2011-10-24 10 views
27

Ho una lista di tuple. Ogni tupla ha 5 elementi (corrispondenti a 5 colonne del database) e mi piacerebbe fare una querySelezionare il valore dall'elenco delle tuple dove condizione

select attribute1 from mylist where attribute2 = something

esempio

personAge = select age from mylist where person_id = 10

E 'possibile interrogare l'elenco di tuple in qualche modo?

grazie

risposta

42

Se avete named tuples si può fare questo:

results = [t.age for t in mylist if t.person_id == 10] 

altrimenti utilizzare indici:

results = [t[1] for t in mylist if t[0] == 10] 

O uso tuple disimballaggio come per la risposta di Nate. Si noti che non è necessario dare un nome significativo a ogni articolo che si disimballa. È possibile eseguire (person_id, age, _, _, _, _) per decomprimere una tupla di sei elementi.

11

Una soluzione a questo sarebbe una lista di comprensione, con pattern matching all'interno del vostro tuple:

>>> mylist = [(25,7),(26,9),(55,10)] 
>>> [age for (age,person_id) in mylist if person_id == 10] 
[55] 

Un altro modo sarebbe utilizzando map e filter:

>>> map(lambda (age,_): age, filter(lambda (_,person_id): person_id == 10, mylist)) 
[55] 
6

Sì, è possibile utilizzare il filtro se sai in quale posizione nella tupla risiede la colonna desiderata. Se il caso è che l'id è il primo elemento della tupla allora si può filtrare l'elenco in questo modo:

filter(lambda t: t[0]==10, mylist) 

Questo restituirà la lista di tuple corrispondenti. Se vuoi l'età, scegli l'elemento che desideri. Invece del filtro puoi anche usare la comprensione delle liste e scegliere l'elemento al primo tentativo. Si potrebbe anche apre la confezione subito (se c'è un solo risultato):

[age] = [t[1] for t in mylist if t[0]==10] 

Ma io consiglio vivamente di utilizzare dictionaries o named tuples per questo scopo.

+0

E se l'OP desidera utilizzare un qualificatore diverso? Ad esempio, un intervallo invece di un valore? Questo precluderebbe l'uso dei dizionari. – Nate

+0

@Nate Poiché non lo sono, ha una lista di tuple omogenee, ad esempio: '[(1, 'nome', 20, 'bar'), (2, 'nome2', 33, 'foo'), ... ] 'e se volessi lavorare con questo, mapperei ogni tupla nel dizionario, ad esempio:' [{'id': 1, 'name': 'name', 'age': 20, 'etc': 'bar '}, ..] '. Interrogarsi sarebbe diventato molto più leggibile. Se scrivo solo con l'ID, potrei usarlo anche come chiave del dizionario (quindi sarebbe un dizionario di dizionari). – rplnt

+0

Immagino che volevo dire che se voleva 'selezionare dove person_id> 5 e person_id <15' o qualcosa del genere, i dizionari non sono attrezzati per eseguire questo tipo di ricerca; Inoltre, cosa succederebbe se volesse selezionare per età invece? Dovresti eseguire una sorta di comprensione del dizionario in entrambi i casi. – Nate