web-dev-qa-db-fra.com

Récupère le premier élément de chaque tuple dans une liste dans Python

Une requête SQL me donne une liste de n-uplets, comme ceci:

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

J'aimerais avoir tous les premiers éléments de chaque tuple. En ce moment j'utilise ceci:

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

Mais je pense qu'il pourrait y avoir une meilleure syntaxe pour le faire. Connaissez-vous un meilleur moyen?

105
Creak

Utilisez un compréhension de la liste :

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

Ci-dessous une démonstration:

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

Alternativement, vous pouvez utiliser unpackage au lieu de x[0]:

res_list = [x for x,_ in rows]

Ci-dessous une démonstration:

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

Les deux méthodes font pratiquement la même chose, vous pouvez donc choisir ce que vous voulez.

167
iCodez

La manière fonctionnelle d’y parvenir consiste à décompresser la liste en utilisant:

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)
22
rbonallo

Si vous ne voulez pas utiliser la compréhension de liste pour certaines raisons, vous pouvez utiliser map et operator.itemgetter :

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

Vous pouvez utiliser la compréhension de liste:

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

Cela devrait faire l'affaire

11
Ruben Bermudez
res_list = [x[0] for x in rows]

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

Pour une discussion sur les raisons pour lesquelles préférer les compréhensions aux fonctions d'ordre supérieur telles que map, accédez à http://www.artima.com/weblogs/viewpost.jsp?thread=98196 .

6
Aegis