web-dev-qa-db-fra.com

Python sélection liste / sous-liste -1 bizarrerie

J'ai donc joué avec python et j'ai remarqué quelque chose qui semble un peu étrange. La sémantique de -1 Dans la sélection dans une liste ne semble pas cohérente.

J'ai donc une liste de chiffres

ls = range(1000)

Le dernier élément de la liste si bien sûr ls[-1] Mais si j'en prends une sous-liste pour que j'obtienne tout de dire du milieu à la fin je ferais

ls[500:-1]

mais cela ne me donne pas une liste contenant le dernier élément de la liste, mais plutôt une liste contenant tout JUSQU'AU dernier élément. Mais si je le fais

ls[0:10]

J'obtiens une liste contenant également le dixième élément (donc le sélecteur doit être inclusif), alors pourquoi cela ne fonctionne-t-il pas pour -1.

Je peux bien sûr faire ls[500:] Ou ls[500:len(ls)] (ce qui serait idiot). Je me demandais juste quel était l'accord avec -1, je me rends compte que je n'en ai pas besoin là-bas.

35
Matti Lyra

Dans list[first:last], last n'est pas inclus.

Le 10ème élément est ls[9], dans ls[0:10] il n'y a pas ls[10].

79
dugres

Si vous voulez obtenir un sous-liste incluant le dernier élément, vous laissez vide après les deux points:

>>> ll=range(10)
>>> ll
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> ll[5:]
[5, 6, 7, 8, 9]
>>> ll[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
14
mcane

J'obtiens un comportement cohérent pour les deux instances:

>>> ls[0:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> ls[10:-1]
[10, 11, 12, 13, 14, 15, 16, 17, 18]

Notez, cependant, que le dixième élément de la liste est à l'index 9, car la liste est indexée 0. C'est peut-être là que se trouve votre raccrochage.

En d'autres termes, [0:10] ne passe pas de l'index 0-10, il passe effectivement de 0 au dixième élément (ce qui vous donne les index 0-9, puisque le 10 n'est pas inclus à la fin de la tranche).

4
eldarerathis

-1 n'est pas spécial dans le sens où la séquence est lue à l'envers, elle s'enroule plutôt autour des extrémités. Telle que moins un signifie zéro moins un, exclusif (et, pour une valeur de pas positive, la séquence est lue "de gauche à droite".

donc pour i = [1, 2, 3, 4], i[2:-1] signifie de l'élément deux à le début moins un (ou, 'jusqu'à la fin')) , ce qui se traduit par [3]. Le -1ème élément, ou élément en arrière 1 est le dernier 4, mais comme c'est exclusif, nous en obtenons 3.

J'espère que c'est quelque peu compréhensible.

2
Stefano Palazzo

Cela me semble assez cohérent; les indices positifs sont également non inclusifs. Je pense que vous vous trompez. En se rappelant que range () n'est pas non plus inclusif, et que Python sont indexés 0, voici un exemple de session python pour illustrer:

>>> d = range(10)
>>> d
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> d[9]
9
>>> d[-1]
9
>>> d[0:9]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> d[0:-1]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> len(d)
10
1
Yoni Samlan

lors du découpage d'un tableau;

ls[y:x]  

prend la tranche de l'élément y jusqu'à et sans inclure x. lorsque vous utilisez l'indexation négative, cela équivaut à utiliser

ls[y:-1] == ls[y:len(ls)-1]

donc il si la tranche serait jusqu'au dernier élément, mais il ne l'inclurait pas (selon la tranche)

1
Andy