Почему индексирование списка [-4: 0] не работает, а [0: 4] работает? - PullRequest
0 голосов
/ 22 декабря 2018

Если индексация отрицательного списка начинается с конца списка и, скажем, у нас есть:

l = [1,2,3,4,5]

и l[0:3] и l[:3] возвращает те же значения, в то время как l[-3:0] возвращает пустоеlist и l[-3:] возвращает [3,4,5]

Какова логика запрета list[-x:0] на возврат списка?

Ответы [ 4 ]

0 голосов
/ 22 декабря 2018

Отрицательные индексы действуют с конца списка.Скажем, если вы хотите получить последние 3 элемента, вы можете сделать:

# Reversing and restoring the order
my_list = [1,2,3,4,5,6]
print(reversed(reversed(my_list)[:3]))

# Subtracting from the size
size = len(my_list)
print(my_list[size-3:])

Но вместо этого вы можете набрать

my_list[-3:]

Что в словах будет означать получить мне кусоксписка, начиная с третьего пункта в конце списка

Таким образом, вы должны знать, о чем вы спрашиваете.

# Slice from the x'th element at the end till the end of the list
my_list[-x:]

# Slice from the x'th element at the end till the y'th element at the end of the list
my_list[-x:-y]

# Slice from the x'th element at the end till the y'th element from the start of the list. 
# Only valid if len(my_list) - y < x and y > 0
my_list[-x:y] 
0 голосов
/ 22 декабря 2018

l[-3:0] пытается нарезать от 3 сзади к 0 - это то же самое, что l[2:0] .., который ничего не разрезает, потому что первое значение> второе значение.

l[-3:] можно прочитать какl[-3:len(l)] - так l[2:5], который возвращает срез.

Вам понадобится l[-3:0:-1], чтобы это сработало - но это ошеломляющая нарезка, которую я стараюсь избегать.(print( [1,2,3,4,5][-3:0:-1] -> [3, 2]), поскольку он также меняет ориентацию среза назад, а не вперед

l[-3:] срезы от 3 сзади до конца.

0 голосов
/ 22 декабря 2018

Полное обозначение слайса в Python следующее:

s[start:end:step]

При этом он обеспечивает полезные значения по умолчанию для значений в соответствии с документацией :

Индексы срезов имеют полезные значения по умолчанию;пропущенный первый индекс по умолчанию равен нулю, пропущенный второй индекс по умолчанию равен размеру разрезанной строки.

Поэтому, когда вы делаете что-то вроде:

s[1:]

под капотомэто сделано:

s[1:len(s)]

Обратите внимание, что в обоих случаях step по умолчанию 1.Например, в большинстве языков, когда вы хотите получить доступ к последнему элементу списка, вы делаете что-то вроде:

s[len(s) - 1]

Негативная индексация Python является своего рода синтаксическим сахаром в этой записи, так:

l[-1] = l[len(l) - 1]
l[-2] = l[len(l) - 2]
...

Затем, когда вы делаете:

l[-3:]

, это делается:

l[len(l)-3:len(l)]

Таким образом, вместо 0 вы должны использовать len(l) какпоследний индекс:

l = [1, 2, 3, 4, 5]
print(l[-3:len(l)])

Выход

[3, 4, 5]

Обратите внимание, что l[-3:0] возвращает пустой список, потому что len(l) - 3 > 0, то есть первый индекс большевторой и шаг равен 1.

Далее

  1. Понимание обозначения среза Python
0 голосов
/ 22 декабря 2018

Хорошо 0 впереди работает, но в конце концов ... не будет работать, то же самое с этим:

>>> l=[1,2,3,4,5]
>>> l[2:0]
[]
>>> 

, потому что питон думает ноль в конце ...

Так что это практически эквивалентно:

>>> l=[1,2,3,4,5]
>>> l[:0]
[]
>>> 

, поскольку, конечно, ничего не существует до первого элемента, если бы существовала эта вещь, она не была бы первым элементом, она была бы вторым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...