Disons que nous avons une liste de nombres de 0 à 1000. Existe-t-il un moyen pythonique / efficace de produire une liste du premier élément et de chaque 10e élément suivant, c'est [0, 10, 20, 30, ... ]
-à- dire ?
Oui, je peux le faire en utilisant une boucle for, mais je me demande s'il existe un moyen plus propre de le faire, peut-être même en une seule ligne?
0
est redondant dansl[0::10]
.l[::10]
est plus lisible, moins déroutant.source_list[::10]
est le plus évident, mais cela ne fonctionne pour aucun itérable et n'est pas efficace en mémoire pour les grandes listes.itertools.islice(source_sequence, 0, None, 10)
fonctionne pour tout itérable et est efficace en mémoire, mais ce n'est probablement pas la solution la plus rapide pour les grandes listes et les grandes étapes.(source_list[i] for i in xrange(0, len(source_list), 10))
la source
Vous pouvez utiliser l'opérateur de tranche comme ceci:
la source
L[2::2]
À partir du manuel:
s[i:j:k] slice of s from i to j with step k
la source
Cela sélectionne tous les 10 éléments de la liste.
la source
Pourquoi ne pas simplement utiliser un paramètre d' étape de la fonction de plage pour obtenir:
A titre de comparaison, sur ma machine:
la source
la source
Voici une meilleure implémentation d'une compréhension de liste «tous les 10 éléments», qui n'utilise pas le contenu de la liste dans le cadre du test d'adhésion:
Mais c'est encore beaucoup plus lent que d'utiliser simplement le découpage de liste.
la source
Les compréhensions de listes sont exactement faites pour cela:
Vous pouvez obtenir plus d'informations à leur sujet dans la documentation officielle de python: http://docs.python.org/tutorial/datastructures.html#list-comprehensions
la source