提问人:Kanika Nadar 提问时间:6/18/2023 更新时间:6/18/2023 访问量:81
如果未提及步骤,为什么切片字符串不起作用?
Why is slicing a string not working if step is not mentioned?
问:
我正在研究使用切片运算符在字符串中切片。:
我选择的字符串是 .word = 'fabricated'
据我介绍,以下陈述的输出:
print(word[5:-8])
print(word[-3:-9])
应为:
cir
tacirb
但是,在运行这些语句时不会打印任何内容。无论是在 Google Colab 上还是在 VS Code 上。
但是当我特别提到参数如下时:step
print(word[5:-8:-1])
print(word[-3:-9:-1])
我得到的预期输出如下:
cir
tacirb
我想了解为什么我得到一个长度的字符串,尽管参数不是强制性的。0
step
答:
它不是必需的,但它默认为向前,而不是向后,并且它不会根据端点自动翻转方向。如果结束先于开始,并且步骤为正,则切片将为空。
如果将负指数转换为正等价物,则更容易理解。从您的示例开始:[5:-8]
>>> word = 'fabricated'
>>> word[5:-8]
''
>>> word[5:-8:-1]
'cir'
负索引只是被视为已将其添加到序列中,因此对于这个 10 个字母,索引 等价于 10 - 8 = 2 的索引:len
word
-8
>>> len(word)
10
>>> word[5:2]
''
>>> word[5:2:-1]
'cir'
显然,当你数数时,2 在 5 之前。从 5 到 2 的唯一方法是倒计时(即切片参数必须为负数)。step
如您所注意,步长不是必需的,但默认为 。特别是,等价于 或 。None
word[5:-8]
word[slice(5, -8)]
word[slice(5, -8, None)]
当得到这样的切片时,它的处理方式与 .(我怀疑大多数实现都会,但它们不需要。当步长为正时,您只得到一个非空字符串,如果 ,则不考虑所涉及的符号。当步长为负数时(即,当显式提供负步长时),则生成一个非空字符串,如果(同样,与所涉及的符号无关)。word.__getitem__
None
1
__getitem__
start < stop
stop < start
默认情况下,切片从起始索引开始,并按顺序向前推进,直到到达结束索引。
如果结束指数大于起始指数,则不会推断方向应该是向后的。它仍然默认为转发。
字符串切片遵循以下规则-
序列 [start:stop[:step]]
start (可选) = 切片的起始索引。默认值为 0。
stop(可选)= 切片的最后一个索引或要获取的项目数。默认为 len(sequence)。
step(可选)= 扩展切片语法。切片的步长值。默认值为 1。
f | 一个 | b | r | 我 | c | 一个 | t | e | d | <= 序列元素 |
---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <= 正指数 |
10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | <= 负指数 |
捏造的单词将表示为 [0:9:1]
从上表中 - 当切片为 word[5:-8]) 变为 word[5:-8]) = word[5:-
8:1]) 时。从桌子上,您将从右向左移动,并且由于步骤是正当的,因此它的移动将从左到右。在这里,我们有不同方向的运动,因此不会考虑焦炭。
当从表格中切成单词[5:-8:-1])时,5:-8的移动将从右到左,步数也将从右到左移动。在这里,我们向同一方向移动,因此您得到了结果。
有关详细信息,请查看此字符串切片
上一个:[T], 和 [T] 之间的区别
下一个:Python 中的切片工作原理
评论