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

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

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

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

Ответы [ 6 ]

31 голосов
/ 29 января 2009

Да, звонить s[0:-1] точно так же, как звонить s[:-1].

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

так что если у вас есть список:

myList = ['a', 'b', 'c', 'd', 'e']
print myList[-1] # prints '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 .

4 голосов
/ 03 января 2017
>>> 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']

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

  1. Сначала напишите первый элемент. Вы можете использовать положительный или отрицательный индекс для этого. Я ленивый, поэтому использую позитив, на один ход меньше (ниже 7 или -3 для начала).
  2. Индекс элемента непосредственно перед тем, где вы хотите остановиться. Опять же, вы можете использовать положительный или отрицательный индекс для этого (ниже 2 или -8 для остановки).
  3. Здесь знак имеет значение; конечно - назад; значение шага вы знаете. 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].

4 голосов
/ 29 января 2009

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

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

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

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

3 голосов
/ 29 января 2009

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

1 голос
/ 29 января 2009

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

[beginning_index:ending_index]

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

0 голосов
/ 11 марта 2019

Если мы хотим напечатать из конца строки, мы можем пойти на отрицательную индексацию. Индексирование начинается с -1.

Пример: s = 'hello world'

s [-11: -1] = 'привет, мир' s [-1: -11] = '' // начальное значение должно быть ниже (т.е. в этом случае -1 больше -11), если оно больше, оно ничего не печатает.

...