web-dev-qa-db-fra.com

Inverser une liste à l'aide de la notation par tranche

dans l'exemple suivant:

foo = ['red', 'white', 'blue', 1, 2, 3]

où: foo[0:6:1] affichera tous les éléments dans foo. Toutefois, foo[6:0:-1] omettra le 1er ou le 0e élément.

>>> foo[6:0:-1]
[3, 2, 1, 'blue', 'white']

Je comprends que je peux utiliser foo.reverse () ou foo [:: - 1] pour imprimer la liste à l'envers, mais j'essaie de comprendre pourquoi foo [6: 0: -1] n'imprime pas la liste entière ?

56
user737079

Notation de tranche en bref:

[ <first element to include> : <first element to exclude> : <step> ]

Si vous souhaitez inclure le premier élément lors de l'inversion d'une liste, laissez l'élément du milieu vide, comme ceci:

foo[::-1]

Vous pouvez également trouver de bonnes informations sur les tranches Python en général ici:
Expliquer la notation de tranche de Python

106
Andrew Clark

Si vous avez du mal à vous souvenir de la notation des tranches, vous pouvez essayer de faire Hokey Cokey :

[ Entrée : Sortie : Secouez tout ]

[Premier élément à dans clude: Premier élément à exclure : Le étape à utiliser]

YMMV

8
Captain Lepton

... pourquoi foo [6: 0: -1] n'imprime pas la liste entière?

Parce que la valeur intermédiaire est la valeur d'arrêt exclusive , plutôt qu'inclusive. notation d'intervalle est [start, stop).

Voici comment fonctionne la plage [x]:

>>> range(6, 0, -1)
[6, 5, 4, 3, 2, 1]

Ce sont les indices qui sont inclus dans votre liste résultante, et ils n'incluent pas 0 pour le premier élément.

>>> range(6, -1, -1)
[6, 5, 4, 3, 2, 1, 0]

Une autre façon de voir les choses est:

>>> L = ['red', 'white', 'blue', 1, 2, 3]
>>> L[0:6:1]
['red', 'white', 'blue', 1, 2, 3]
>>> len(L)
6
>>> L[5]
3
>>> L[6]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

L'indice 6 est au-delà (un seul, précisément) des indices valides pour L, l'excluant ainsi de la plage comme valeur d'arrêt exclue:

>>> range(0, 6, 1)
[0, 1, 2, 3, 4, 5]

Vous donne toujours des indices pour chaque élément de la liste.

6
Fred Nurk

Cette réponse est peut-être un peu dépassée, mais elle pourrait être utile pour quelqu'un qui est resté avec le même problème. Vous pouvez obtenir une liste inversée avec une fin arbitraire - jusqu'à 0 index, en appliquant une deuxième tranche sur place comme ceci:

>>> L = list(range(10))
>>> L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> (start_ex, end) = (7, 0)
>>> L[end:start_ex][::-1]
[6, 5, 4, 3, 2, 1, 0]
3
Emreu

Utilisation

>>>foo[::-1]

Cela affiche l'inverse de la liste de l'élément de fin au début,

1
Ashmita Dutta