Индексировать фрагмент строки с его конца переменной в python не обеспечивает общий доступ к последнему элементу - PullRequest
0 голосов
/ 04 февраля 2019

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

В python вы можете индексировать последовательности (строки, списки или кортежи) с конца с отрицательным значением индекса,и вы можете нарезать их, используя ":" внутри квадратных скобок.Например, вы можете использовать "123456789"[-4:-2], чтобы получить "67".Вы даже можете использовать переменную:

for i in range(-4, 0):
    print('"123456789"[-5:{}] yields "{}"'.format(i, "123456789"[-5:i]))

, которая даст

"123456789"[-5:-4] yields "5"
"123456789"[-5:-3] yields "56"
"123456789"[-5:-2] yields "567"
"123456789"[-5:-1] yields "5678"

, но что, если вы хотите подняться на последнюю позицию?потому что print(0, "123456789"[-5:0]) не сработает:

for i in range(-4, 1):
    print('"123456789"[-5:{}] yields "{}"'.format(i, "123456789"[-5:i]))

, что даст

"123456789"[-5:-4] yields "5"
"123456789"[-5:-3] yields "56"
"123456789"[-5:-2] yields "567"
"123456789"[-5:-1] yields "5678"
"123456789"[-5:0] yields ""

Один из способов решить эту проблему - получить None вместо 0 вЧтобы эмулировать этот код: print(i, "123456789"[-5:])

for r in range(-4, 0)), [None]:
    for i in r:
        print('"123456789"[-5:{}] yields "{}"'.format(i, "123456789"[-5:i]))

или

for i in [ x for r in [range(-4, 0)), [None] for x in r]:
    print('"123456789"[-5:{}] yields "{}"'.format(i, "123456789"[-5:i]))

, что даст

"123456789"[-5:-4] yields "5"
"123456789"[-5:-3] yields "56"
"123456789"[-5:-2] yields "567"
"123456789"[-5:-1] yields "5678"
"123456789"[-5:None] yields "56789"

, но это не идеальное решение, потому что None не означает последнюю позицию, но значение по умолчанию, которое будет зависеть от знака шага и приведет к противоречивым результатам, если шаг имеет отрицательное значение:

for step in 1, -1:
    print("step={}".format(step))
    for r in [range(-7, -0), [None,]]:
        for i in r:
            print('"123456789"[-4:{}:{}] yields "{}"'.format(i, step, "123456789"[-4:i:step]))

даст

step=1
"123456789"[-4:-7:1] yields ""
"123456789"[-4:-6:1] yields ""
"123456789"[-4:-5:1] yields ""
"123456789"[-4:-4:1] yields ""
"123456789"[-4:-3:1] yields "6"
"123456789"[-4:-2:1] yields "67"
"123456789"[-4:-1:1] yields "678"
"123456789"[-4:None:1] yields "6789"
step=-1
"123456789"[-4:-7:-1] yields "654"
"123456789"[-4:-6:-1] yields "65"
"123456789"[-4:-5:-1] yields "6"
"123456789"[-4:-4:-1] yields ""
"123456789"[-4:-3:-1] yields ""
"123456789"[-4:-2:-1] yields ""
"123456789"[-4:-1:-1] yields ""
"123456789"[-4:None:-1] yields "654321"

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

Ответы [ 4 ]

0 голосов
/ 04 февраля 2019

В качестве умственного упражнения вы можете перевернуть строку, взять необходимый кусочек и повернуть его обратно.Если вы перебираете значения: -):

in [1]: for i in range(1, 6):
...:     print('123456789'[::-1][:i][::-1])
...:
9
89
789
6789
56789
0 голосов
/ 04 февраля 2019

None не последний элемент в последовательности.None является границей последовательности, и когда вы меняете направление, вы получаете ожидаемый результат.

>>> s = "1234567890"
>>> s[-5::1]
'67890'
>>> s[-5::-1]
'654321'
>>> s[-5:len(s):1]
'67890'
>>> s[-5:len(s):-1]
''
0 голосов
/ 04 февраля 2019

Как заметил @Daniel Mesejo, если я готов использовать константу None, я также могу использовать len (s) или, как заметил @Salai Madhavan: любое очень большое число, которое будет автоматически преобразовано в len(s).

for step in 1, -1:
    print("step={}".format(step))
    for r in [range(-7, -0), [999999,]]:
        for i in r:
            print('"123456789"[-4:{}:{}] yields "{}"'.format(i, step, "123456789"[-4:i:step]))

даст

step=1
"123456789"[-4:-7:1] yields ""
"123456789"[-4:-6:1] yields ""
"123456789"[-4:-5:1] yields ""
"123456789"[-4:-4:1] yields ""
"123456789"[-4:-3:1] yields "6"
"123456789"[-4:-2:1] yields "67"
"123456789"[-4:-1:1] yields "678"
"123456789"[-4:None:1] yields "6789"
step=-1
"123456789"[-4:-7:-1] yields "654"
"123456789"[-4:-6:-1] yields "65"
"123456789"[-4:-5:-1] yields "6"
"123456789"[-4:-4:-1] yields ""
"123456789"[-4:-3:-1] yields ""
"123456789"[-4:-2:-1] yields ""
"123456789"[-4:-1:-1] yields ""
"123456789"[-4:999999:-1] yields ""
0 голосов
/ 04 февраля 2019

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

"123456789"[-5:len('123456789')] также приводит к '56789'

...