如果未提及步骤,为什么切片字符串不起作用?

Why is slicing a string not working if step is not mentioned?

提问人:Kanika Nadar 提问时间:6/18/2023 更新时间:6/18/2023 访问量:81

问:

我正在研究使用切片运算符在字符串中切片。:

我选择的字符串是 .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

我想了解为什么我得到一个长度的字符串,尽管参数不是强制性的。0step

Python 字符串 切片

评论


答:

2赞 Samwise 6/18/2023 #1

它不是必需的,但它默认为向前,而不是向后,并且它不会根据端点自动翻转方向。如果结束先于开始,并且步骤为正,则切片将为空。

如果将负指数转换为正等价物,则更容易理解。从您的示例开始:[5:-8]

>>> word = 'fabricated'
>>> word[5:-8]
''
>>> word[5:-8:-1]
'cir'

负索引只是被视为已将其添加到序列中,因此对于这个 10 个字母,索引 等价于 10 - 8 = 2 的索引:lenword-8

>>> len(word)
10
>>> word[5:2]
''
>>> word[5:2:-1]
'cir'

显然,当你数数时,2 在 5 之前。从 5 到 2 的唯一方法是计时(即切片参数必须为负数)。step

2赞 chepner 6/18/2023 #2

如您所注意,步长不是必需的,但默认为 。特别是,等价于 或 。Noneword[5:-8]word[slice(5, -8)]word[slice(5, -8, None)]

当得到这样的切片时,它的处理方式与 .(我怀疑大多数实现都会,但它们不需要。当步长为正时,您只得到一个非空字符串,如果 ,则不考虑所涉及的符号。当步长为负数时(即,当显式提供负步长时),则生成一个非空字符串,如果(同样,与所涉及的符号无关)。word.__getitem__None1__getitem__start < stopstop < start

0赞 John Gordon 6/18/2023 #3

默认情况下,切片从起始索引开始,并按顺序向前推进,直到到达结束索引。

如果结束指数大于起始指数,则不会推断方向应该是向后的。它仍然默认为转发

0赞 Sachin 6/18/2023 #4

字符串切片遵循以下规则-

序列 [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的移动将从右到左,步数也将从右到左移动。在这里,我们向同一方向移动,因此您得到了结果。

有关详细信息,请查看此字符串切片