Генерация и нарезка перевернутого списка - PullRequest
0 голосов
/ 03 декабря 2018

Это, вероятно, глупо и просто, но как мне получить список edcba

Когда я пытаюсь:

import string
letters = string.ascii_lowercase
letters[4:0:-1]

'edcb'

Это как-то делаетсмысл, так как индекс [4,3,2,1].Однако использование -1 приводит к следующему:

letters[4:-1:-1]

''

Я знаю, что могу просто сделать "".join(reversed(letters[:5])) или использовать понимание списка, но мне любопытно, как это сделатьс отрицательными шагами.

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018
import string
letters = string.ascii_lowercase
lent = len(letters)
data = []
for l in range(1,lent):
    total = lent - int(l)
    data.append(letters[total])
data.append(letters[0])
print(data)
0 голосов
/ 04 декабря 2018
letters[4:-1:-1]

Причина, по которой вы неожиданно получаете пустую строку в результате, заключается в том, что вы просили перейти от индекса 4 до достижения конца строки (-1) с шагом -1.

Индекс -1 в этом контексте эквивалентен индексу 25, так что вы по сути сделали letters[4:25:-1] - как только Python попытается оценить первый элемент в срезе, онсделано, потому что вы уже вышли за пределы.Выражение такого же типа с положительным приращением будет letters[5:4] - это делается до его запуска.

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

letters[4::-1], что в основном letters[4:None:-1]

Подумайте о slice следующим образом:

[element to start at: 
 element to start excluding: 
 steps]

Таким образом, не указав явно 1009 * во второй частисрез, вы говорите интерпретатору начинать с индекса 4 и переходить к шагу -1 до тех пор, пока элементы не будут найдены.

Еще один способ визуализировать это, если вы должны сделать это вперед и хотите "vwxyz", вы бы не использовали letters[21:25:1], а просто letters[21:], что означает letters[21:None:1]

...