Рассуждение на основе промежуточных позиций работает, когда мы выполняем итерацию слева направо:
li = [10, 20, 55, 65, 75, 120, 1000]
print 'forward slicing li[2:5] ->',li[2:5]
# prints forward slicing li[2:5] -> [55, 65, 75]
потому что поз 2 между 20/55 и поз 5 между 75/120
.
Но это не работает, когда мы выполняем итерацию справа налево:
li = [10, 20, 55, 65, 75, 120, 1000]
print li
print 'reverse slicing li[5:2:-1] ->',li[5:2:-1]
# prints reverse slicing li[5:2:-1] -> [120, 75, 65]
Мы должны думать о li [5: 2: -1] как:
от элемента li [5] (который равен 120) до элемента без учета li [2] (который равен 55)
то есть
из элемента li [5] (что составляет 120) только в том случае, если li [3] включает (что составляет 65).
.
Это делает опасную обратную нарезку с самого конца:
li = [10, 20, 55, 65, 75, 120, 1000]
print li[ -1 : 2 : -1 ]
# prints [1000, 120, 75, 65] not [120, 75, 65, 55]
# the same as:
print li[ None : 2 : -1 ]
# prints [1000, 120, 75, 65]
print li[ : 2 : -1 ]
# prints [1000, 120, 75, 65]
и
li = [10, 20, 55, 65, 75, 120, 1000]
print li[ 4 : 0 : -1]
# prints [75, 65, 55, 20] , not [65, 55, 20, 10]
.
В случае затруднения с таким мышлением, способ предотвратить ошибки - написать
print list(reversed(li[2:5]))
# prints [75, 65, 55]
print list(reversed(li[2:-1]))
# prints [120, 75, 65, 55]
print list(reversed(li[0:4]))
# prints [65, 55, 20, 10]
.
Обратите внимание, что единственный способ получить обратный срез до первого ВКЛЮЧЕННОГО элемента - это
print li[ 4 : : -1]
что означает
print li[ 4 : None : -1]