web-dev-qa-db-fra.com

Le moyen le plus court de découper des lignes paires / impaires à partir d'un tableau python?

Ou, une question plus générale serait de savoir comment découper un tableau pour obtenir chaque n-ème ligne, donc pour pair/impair, vous voudriez sauter une ligne, mais dans le cas général, vous voudriez obtenir chaque n- e lignes, en sautant n-1 lignes.

61
fatcat

En supposant que vous parlez d'une - liste, vous spécifiez l'étape dans la tranche (et commencez l'index). La syntaxe est list[start:end:step].

Vous connaissez probablement l'accès normal à la liste pour obtenir un élément, par exemple l[2] Pour obtenir le troisième élément. En donnant deux nombres et deux points entre les deux, vous pouvez spécifier une plage que vous souhaitez obtenir de la liste. La valeur de retour est une autre liste. Par exemple. l[2:5] Vous donne le troisième au sixième élément. Vous pouvez également passer un troisième nombre facultatif, qui spécifie la taille de l'étape. La taille de pas par défaut est un, ce qui signifie simplement prenez chaque élément (entre l'index de début et de fin).

Exemple:

>>> l = range(10)
>>> l[::2]         # even  - start at the beginning at take every second item
[0, 2, 4, 6, 8]
>>> l[1::2]        # odd - start at second item and take every second item
[1, 3, 5, 7, 9]

Voir listes dans le Python .

Si vous voulez obtenir tous les éléments n- e d'une liste (c'est-à-dire à l'exclusion du premier élément), vous devez découper comme l[(n-1)::n].

Exemple:

>>> l = range(20)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

Maintenant, obtenir chaque troisième élément serait:

>>> l[2::3]
[2, 5, 8, 11, 14, 17]

Si vous souhaitez inclure le premier élément, vous n'avez qu'à faire l[::n].

137
Felix Kling

C'est plus pour moi à titre d'exemple complet;)

>>> import itertools
>>> ret = [[1,2], [3,4,5,6], [7], [8,9]]
>>> itertools.izip_longest(*ret)
>>> [x for x in itertools.chain.from_iterable(tmp) if x is not None]
[1, 3, 7, 8, 2, 4, 9, 5, 6]
1
delijati