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?
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.
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)
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]
>>>
Vous pouvez utiliser la compréhension de liste:
res_list = [i[0] for i in rows]
Cela devrait faire l'affaire
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 .