Этот вопрос не о другом способе решения проблемы, а о существовании синтаксиса для закрытия дыры.Я знаю, что есть много других способов сделать это, но это не то, что меня интересует.
В 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"
есть ли другой способ указать, что мой срез переходит в последнюю позицию вместо позиции по умолчанию?