2010-05-29 4 views
1

Le code suivant inclut le dernier numéro.Étapes dans la question de liste, Python débutant

>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> numbers[::3] 
[1, 4, 7, 10] 

Pourquoi ne pas inclure le dernier nombre 2, comme 10, 8, 6, 4, 2?

>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> numbers[:1:-2] 
[10, 8, 6, 4] 

Répondre

4

Il semble que l'opérateur de tranche ne soit simplement pas inclus dans le second argument. En d'autres mots, votre 1 devrait être 0:

>>> numbers = [1,2,3,4,5,6,7,8,9,10] 
>>> numbers[:1:-2] 
[10, 8, 6, 4] 
>>> numbers[:0:-2] 
[10, 8, 6, 4, 2] 

Hope that helps :)

Pour plus d'information, voir la note 5 here.

+2

Pourquoi pas [:: - 2] à la place? – wvd

+0

Cela fonctionne aussi, bien sûr, mais mon but était de montrer que l'argument '1' était le problème. De plus, faire des déclarations générales comme «Python utilisera 0 où les arguments manquent» est susceptible d'être gênant. –

2

:: est la marche sur la liste des étapes N. Donc c'est 1, alors ça passe à 4, etc. Si vous voulez revenir en arrière avec 2, vous voulez [:: - 2]

0

Parce que la tranche exclut le deuxième nombre de la plage. a[1:4] récupère les éléments 1, 2 et 3. De même, a[10:6:-1] récupère les éléments 10, 9, 8 et 7, mais pas 6.

+0

numéros [10: 6: -1] sorties 10, 9, 8 pas 7. – shin

+0

Je faisais référence aux éléments dans les positions 10 à 7 dans un tableau arbitraire, 'a'. –

2

Python est assez cohérent en suivant le modèle des suites de séquences étant inclusif inférieur, exclusif supérieur. C'est-à-dire, si vous dites range (1,5) -> [1,2,3,4]. L'index inférieur est inclus et le supérieur est exclu. Cela aide beaucoup avec divers types d'erreurs off-by-one et fencepost. Voir wikipedia pour une brève explication de ces types de problèmes.