Obtenga el primer elemento de cada tupla en una lista en Python

Una consulta SQL me da una lista de tuplas, como esta:

[(elt1, elt2), (elt1, elt2), (elt1, elt2), (elt1, elt2), (elt1, elt2), ...] 

Me gustaría tener todos los primeros elementos de cada tupla. Ahora mismo uso esto:

 rows = cur.fetchall() res_list = [] for row in rows: res_list += [row[0]] 

Pero creo que podría haber una mejor syntax para hacerlo. ¿Conoces una forma mejor?

Use una lista de comprensión :

 res_list = [x[0] for x in rows] 

A continuación se muestra una demostración:

 >>> rows = [(1, 2), (3, 4), (5, 6)] >>> [x[0] for x in rows] [1, 3, 5] >>> 

Alternativamente, puedes usar el desempaquetado en lugar de x[0] :

 res_list = [x for x,_ in rows] 

A continuación se muestra una demostración:

 >>> lst = [(1, 2), (3, 4), (5, 6)] >>> [x for x,_ in lst] [1, 3, 5] >>> 

Ambos métodos prácticamente hacen lo mismo, por lo que puedes elegir el que más te guste.

Si no desea utilizar la comprensión de listas por alguna razón, puede usar map y operator.itemgetter :

 >>> from operator import itemgetter >>> rows = [(1, 2), (3, 4), (5, 6)] >>> map(itemgetter(1), rows) [2, 4, 6] >>> 

La forma funcional de lograr esto es descomprimir la lista usando:

 sample = [(2, 9), (2, 9), (8, 9), (10, 9), (23, 26), (1, 9), (43, 44)] first,snd = zip(*sample) print first,snd (2, 2, 8, 10, 23, 1, 43) (9, 9, 9, 9, 26, 9, 44) 

Puedes usar la lista de comprensión:

 res_list = [i[0] for i in rows] 

Esto debería hacer el truco.

 res_list = [x[0] for x in rows] 

cf http://docs.python.org/3/tutorial/datastructures.html#list-comprehensions

Para una discusión sobre por qué preferir las comprensiones sobre las funciones de orden superior, como el map , vaya a http://www.artima.com/weblogs/viewpost.jsp?thread=98196 .