2011-10-24 7 views
27

Tengo una lista de tuplas. Cada tupla tiene 5 elementos (correspondientes a 5 columnas de base de datos) y me gustaría hacer una consultaSeleccione el valor de la lista de tuplas donde la condición

select attribute1 from mylist where attribute2 = something

por ejemplo,

personAge = select age from mylist where person_id = 10

¿Es posible consultar la lista de tuplas de alguna manera?

gracias

Respuesta

42

Si tiene named tuples se puede hacer esto:

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

utilizan de alguna manera índices:

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

O uso tupla desembalaje de acuerdo con la respuesta de Nate. Tenga en cuenta que no tiene que dar un nombre significativo a cada elemento que desempaquete. Puede hacer (person_id, age, _, _, _, _) para descomprimir una tupla de seis elementos.

11

Una solución a esto sería una lista por comprensión, la coincidencia de patrones dentro de la tupla:

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

Otra manera sería utilizar map y filter:

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

Sí, puede utilizar el filtro si sabe en qué posición de la tupla reside la columna deseada. Si el caso es que el id es el primer elemento de la tupla a continuación, puede filtrar la lista de este modo:

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

Esto devolverá la lista de tuplas correspondientes. Si quieres la edad, simplemente elige el elemento que quieras. En lugar de filtro, también puedes usar la comprensión de la lista y elegir el elemento en el primer intento. Incluso se puede desempaquetar inmediato (si sólo hay un resultado):

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

pero recomiendo encarecidamente utilizar dictionaries o named tuples para este propósito.

+0

Pero, ¿qué sucede si el OP quiere usar un calificador diferente? Por ejemplo, un rango en lugar de un valor? Esto excluiría el uso de diccionarios. – Nate

+0

@Nate Como lo entendí, tiene una lista de tuplas homogéneas, por ejemplo: '[(1, 'nombre', 20, 'bar'), (2, 'nombre2', 33, 'foo'), ... ] 'y si quisiera trabajar con esto, asignaría cada tupla al diccionario, por ejemplo:' [{'id': 1, 'name': 'name', 'age': 20, 'etc': 'bar '}, ..] '. Consultarlo sería mucho más legible. Si solo consulto por ID, podría usarlo como una clave de diccionario (por lo que sería un diccionario de diccionarios). – rplnt

+0

Supongo que quise decir que si quería 'seleccionar donde person_id> 5 y person_id <15' o algo así, los diccionarios están mal equipados para realizar este tipo de búsqueda; Además, ¿qué pasaría si él quisiera seleccionar por edad? Tendría que realizar algún tipo de comprensión de diccionario en ambos casos. – Nate

Cuestiones relacionadas