Я не понимаю нарезки с отрицательными границами в Python. Как это должно работать?

Я новичок в Python, и в этой книге я привел следующий пример, который не очень хорошо объяснен. Вот моя распечатка из интерпретатора:

>>> s = 'spam'
>>> s[:-1]
'spa'

Почему нарезка без начальной привязки и '-1' возвращает каждый элемент, кроме последнего? Является ли вызов s[0:-1] логически таким же, как вызов s[:-1]? Они оба возвращают тот же результат. Но я не уверен, что именно делает python. Любая помощь будет принята с благодарностью.

Ответ 1

Да, вызов s[0:-1] в точности совпадает с вызовом s[:-1].

Использование отрицательного числа в качестве индекса в python возвращает n-й элемент из правой части списка (в отличие от обычной левой стороны).

поэтому, если у вас есть список:

myList = ['a', 'b', 'c', 'd', 'e']
print myList[-1] # prints 'e'

оператор печати напечатает "e".

Как только вы поймете это (что вы, возможно, уже не совсем поняли, если это одна из вещей, которую вы путаете или нет), мы можем начать говорить о разрезе.

Я собираюсь предположить, что вы понимаете основы среза по линиям myList[2:4] (который вернет ['c', 'd']) и прыгните прямо в нотацию нарезки, где одна сторона оставлена ​​пустой.

Как вы подозревали в своем сообщении, myList[:index] точно совпадает с myList[0:index].

Это также работает наоборот, между прочим... myList[index:] совпадает с myList[index:len(myList)] и вернет список всех элементов из списка, начинающегося с index, и пройдет до конца (например, print myList[2:] будет печатать ['c', 'd', 'e']).

В качестве третьей заметки вы можете даже сделать print myList[:], где не указывается индекс, который будет в основном возвращать копию всего списка (эквивалентно myList[0:len(myList)], возвращает ['a', 'b', 'c ',' d ',' e ']). Это может быть полезно, если вы думаете, что myList изменится в какой-то момент, но вы хотите сохранить его копию в текущем состоянии.

Если вы еще этого не делаете, я нахожу, что просто интерпретирую в интерпретаторе Python целую кучу большую помощь в понимании этих вещей. Я рекомендую IPython.

Ответ 2

Решающим моментом является то, что индексы python следует рассматривать как указатели на пробелы между записями в списке, а не на сами элементы. Следовательно, 0 указывает на начало, 1 - между первым и вторым,... и n - между nth и (n + 1) st.

Таким образом, l [1: 2] дает вам список, содержащий только элемент l [1], поскольку он дает вам все, что находится между двумя указателями.

Аналогично, отрицательные индексы указывают между элементами, но на этот раз подсчитываются со спины, поэтому -1 указывает между последним и последним, поэтому [0: -1] относится к блоку элементов, а не к включая последний.

В качестве синтаксического сахара вы можете оставить 0 с начала или, по сути, конца, поэтому l [n:] относится ко всему от l [n] до конца (если n >= len (l), тогда он возвращает пустой список).

Ответ 3

Отрицательные индексы подсчитываются с конца, поэтому s [: - 1] эквивалентно s [: len (s) -1], а s [-1] - последний элемент, например.

Ответ 4

>>> l = ['abc', 'def', 'ghi', 'jkl', 'mno', 'pqr', 'stu', 'vwx', 'yz&']

# I want a string up to 'def' from 'vwx', all in between
# from 'vwx' so -2;to 'def' just before 'abc' so -9; backwards all so -1.
>>> l[-2:-9:-1]
['vwx', 'stu', 'pqr', 'mno', 'jkl', 'ghi', 'def']

# For the same 'vwx' 7 to 'def' just before 'abc' 0, backwards all -1
>>> l[7:0:-1]
['vwx', 'stu', 'pqr', 'mno', 'jkl', 'ghi', 'def']

Пожалуйста, не становитесь вялыми о списке.

  • Сначала напишите первый элемент. Вы можете использовать позитивный или отрицательный индекс для этого. Я ленив, поэтому я использую положительный, один удар меньше (ниже 7 или -3 для начала).
  • Указатель элемента непосредственно перед тем, где вы хотите остановить. Опять же, вы можете использовать для этого положительный или отрицательный индекс (ниже 2 или -8 для остановки).
  • Здесь знамения; конечно - для назад; значение шага, которое вы знаете. Stride - это "вектор" с величиной и направлением (ниже -1, назад все).

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

    Все результаты [7, 6, 5, 4, 3].

Ответ 5

Да, вызов s[0:-1] логически совпадает с s[:-1], поскольку нарезка лучше всего определяется как:

[beginning_index:ending_index]

Python позволяет вам опустить 0, поскольку это позволяет вашему коду быть более кратким.