137 votes

Comment extraire les n-èmes éléments d'une liste de tuples

J'essaie d'obtenir les n-ième éléments d'une liste de tuples.

J'ai quelque chose comme :

elements = [(1,1,1),(2,3,7),(3,5,10)]

Je ne souhaite extraire que les deuxièmes éléments de chaque tuple dans une liste :

seconds = [1, 3, 5]

Je sais que cela pourrait se faire avec une boucle for mais je voulais savoir s'il y a un autre moyen puisque j'ai des milliers de tuples.

221voto

luc Points 13564
n = 1 # N. . .
[x[n] for x in elements]

13voto

Graeme Gellatly Points 51

J'ai trouvé ceci alors que je cherchais quelle voie est la plus rapide pour tirer le deuxième élément d'une liste de 2 tuplets. Pas ce que je voulais mais j'ai exécuté le même test que celui montré avec une 3ème méthode plus tester la méthode zip

setup = 'elements = [(1,1) for _ in range(100000)];from operator import itemgetter'
method1 = '[x[1] for x in elements]'
method2 = 'map(itemgetter(1), elements)'
method3 = 'dict(elements).values()'
method4 = 'zip(*elements)[1]'

import timeit
t = timeit.Timer(method1, setup)
print('Method 1: ' + str(t.timeit(100)))
t = timeit.Timer(method2, setup)
print('Method 2: ' + str(t.timeit(100)))
t = timeit.Timer(method3, setup)
print('Method 3: ' + str(t.timeit(100)))
t = timeit.Timer(method4, setup)
print('Method 4: ' + str(t.timeit(100)))

Method 1: 0.618785858154
Method 2: 0.711684942245
Method 3: 0.298138141632
Method 4: 1.32586884499

Donc plus de deux fois plus rapide si vous avez une paire de 2 tuple pour juste convertir en une dictée et prendre les valeurs.

7voto

Oleg Komarov Points 6000

Timings pour Python 3.6 pour extraire le second élément d'une liste de 2 tuplets.

Aussi, a ajouté numpy méthode de tableau, qui est plus simple à lire (mais sans doute plus simple que la compréhension de la liste).

from operator import itemgetter
elements = [(1,1) for _ in range(100000)]

%timeit second = [x[1] for x in elements]
%timeit second = list(map(itemgetter(1), elements))
%timeit second = dict(elements).values()
%timeit second = list(zip(*elements))[1]
%timeit second = np.array(elements)[:,1]

et les horaires :

list comprehension:  4.73 ms ± 206 µs per loop
list(map):           5.3 ms ± 167 µs per loop
dict:                2.25 ms ± 103 µs per loop
list(zip)            5.2 ms ± 252 µs per loop
numpy array:        28.7 ms ± 1.88 ms per loop

Notez que map() et zip() ne renvoient plus de liste, d'où la conversion explicite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X