介绍
Python 字符串数据类型是由一个或多个字符组成的序列,可以包含字母、数字、空格字符或符号。由于字符串是一个序列,我们可以通过索引和切片的方式访问它,就像访问其他基于序列的数据类型一样。
本教程将指导您通过索引访问字符串,通过字符序列切片字符串,并介绍一些计数和字符定位方法。
如何索引字符串
与列表数据类型一样,其中的项目对应一个索引号,字符串的每个字符也对应一个索引号,从索引号0开始。
对于字符串 Sammy Shark!
,索引分布如下:
S | a | m | m | y | S | h | a | r | k | ! | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
可以看到,第一个 S
从索引0开始,字符串以 !
符号的索引11结束。
我们还注意到 Sammy
和 Shark
之间的空格字符也对应着它自己的索引号。在这种情况下,与空格相关联的索引号为5。
叹号 (!
) 也有与之相关联的索引号。任何其他符号或标点符号,如 *#$&.;?
,也是字符,并与它自己的索引号相关联。
Python字符串中的每个字符都有一个相应的索引号,这使得我们可以以与其他序列数据类型相同的方式访问和操作字符串。
通过正索引号访问字符
通过引用索引号,我们可以隔离字符串中的一个字符。我们通过将索引号放在方括号中来实现这一点。让我们声明一个字符串,打印它,并调用方括号中的索引号:
ss = "Sammy Shark!"
print(ss[4])
[secondary_label Output]
y
当我们引用字符串 ss = "Sammy Shark!"
的索引号4时,Python将返回在该位置的字符。由于字母 y
在字符串中的索引号为4,因此当我们打印 ss[4]
时,输出将是 y
。
索引号允许我们访问字符串中的特定字符。
通过负索引号访问字符
如果我们有一个很长的字符串,我们想要定位末尾的某个项目,我们还可以从字符串的末尾开始倒数,从索引号 -1
开始。
对于相同的字符串 Sammy Shark!
,负索引号的分布如下:
S | a | m | m | y | S | h | a | r | k | ! | |
---|---|---|---|---|---|---|---|---|---|---|---|
-12 | -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
通过使用负索引号,我们可以打印出字符 r
,通过引用其在索引 -3 处的位置,如下:
print(ss[-3])
r
使用负索引号对于隔离长字符串末尾的单个字符非常有优势。
切片字符串
我们还可以从字符串中调用一系列字符。假设我们只想打印单词 Shark
。我们可以通过创建一个切片来实现,切片是原始字符串中的一系列字符。使用切片,我们可以通过创建由冒号 [x:y]
分隔的索引号范围,调用多个字符值:
print(ss[6:11])
Shark
在构建切片时,比如 [6:11]
,第一个索引号是切片的起始位置(包括),第二个索引号是切片的结束位置(不包括)。这就是为什么在我们上面的例子中范围必须是字符串结束后的索引号的原因。
在切片字符串时,我们创建了一个子字符串,它本质上是存在于另一个字符串中的字符串。当我们调用 ss[6:11]
时,我们实际上是在字符串 Sammy Shark!
中调用子字符串 Shark
。
如果我们想要包含字符串的任一端,我们可以省略 string[n:n]
语法中的一个数字。例如,如果我们想要打印字符串 ss
的第一个单词 - “Sammy” - 我们可以通过键入以下方式实现:
print(ss[:5])
Sammy
我们通过省略切片语法中冒号前面的索引号,并仅包括冒号后面的索引号,这是对子字符串末尾的引用。
要打印从字符串中间开始并打印到末尾的子字符串,我们可以通过仅包括冒号前面的索引号来实现,如下所示:
print(ss[7:])
hark!
通过仅包括冒号前面的索引号,并在语法中留出第二个索引号,子字符串将从所调用索引号的字符开始一直到字符串的末尾。
您还可以使用负索引号切片字符串。正如我们之前所讨论的,字符串的负索引号从 -1 开始,并向字符串的开始递减。在使用负索引号时,我们将从字符串开头开始的较小数字作为第一个索引号。
让我们使用两个负索引号来切片字符串 ss
:
print(ss[-4:-1])
ark
子字符串 “ark” 是从字符串 “Sammy Shark!” 中打印出来的,因为字符 “a” 位于索引号 -4 的位置,而字符 “k” 位于索引号 -1 之前的位置。
在切片字符串时指定步长
切片字符串可以接受除两个索引号之外的第三个参数。第三个参数指定步长,指的是在从字符串中检索第一个字符之后移动多少个字符。到目前为止,我们省略了步长参数,Python 默认步长为 1,因此会检索两个索引号之间的每个字符。
让我们回顾一下上面打印子字符串 “Shark”的示例:
print(ss[6:11])
Shark
通过包含步长为 1 的第三个参数,我们可以获得相同的结果:
print(ss[6:11:1])
Shark
因此,步长为 1 将获取两个索引号之间的每个字符。如果省略步长参数,则 Python 将默认为 1。
如果我们增加步长,我们会看到字符被跳过:
print(ss[0:12:2])
SmySak
在 Python 语法 ss[0:12:2]
中,指定步长为 2 跳过每个其他字符。让我们回顾一下被突出显示的字符:
请注意,索引号 5 处的空格字符也会在步长为 2 时被跳过。
如果我们使用较大的数字作为步长参数,我们将获得一个显着较小的子字符串:
print(ss[0:12:4])
Sya
在 Python 语法 ss[0:12:4]
中,指定步长为 4 将只打印每四个字符一次。再次看一下突出显示的字符:
在此示例中,空格字符也在步长为 4 时被跳过。
由于我们打印整个字符串,我们可以省略两个索引号,并在语法中保留两个冒号以获得相同的结果:
print(ss[::4])
Sya
省略两个索引号并保留冒号将保持整个字符串在范围内,同时在最后的参数中添加步长将指定要跳过的字符数。
此外,您还可以为步长指定负数值,通过将步长设置为 -1,我们可以使用负步长打印出原始字符串的反向顺序:
print(ss[::-1])
!krahS ymmaS
没有指定参数的两个冒号将包括原始字符串的所有字符,步长为 1 将包括所有字符而不跳过,而否定步长将颠倒字符的顺序。
让我们再来一个步长为 -2 的例子:
print(ss[::-2])
!rh ma
在这个例子中,ss[::-2]
,我们处理原始字符串的全部,因为参数中未包含索引号,并通过负步长反转字符串。此外,通过将步长设置为 -2,我们跳过反转字符串的每隔一个字母:
在这个例子中,空格字符也被打印。
通过指定 Python 切片语法的第三个参数,您可以指定要从原始字符串中提取的子字符串的步长。
计数方法
当我们考虑与字符串中的字符对应的相关索引号时,了解一些计数字符串或返回索引号的方法是值得的。这对于限制我们希望在用户输入表单中接受的字符数或比较字符串非常有用。与其他序列数据类型一样,字符串可以通过多种方法进行计数。
首先,我们将看一下 len()
方法,该方法可以获取任何有序或无序数据类型的长度,包括字符串、列表、元组和字典。
让我们打印字符串 ss
的长度:
print(len(ss))
12
字符串 “Sammy Shark!” 的长度为12个字符,包括空格字符和叹号符号。
我们也可以直接将字符串传递到 len()
方法中:
print(len("Let's print the length of this string."))
38
len()
方法计算字符串中的字符总数。
如果我们想要计算字符串中一个特定字符或字符序列出现的次数,我们可以使用 str.count()
方法。让我们使用我们的字符串 ss = "Sammy Shark!"
并计算字符 “a” 出现的次数:
print```python
(ss.count("a"))
2
我们可以搜索另一个字符:
print(ss.count("s"))
0
尽管字母 “S” 存在于字符串中,但重要的是要记住每个字符是大小写敏感的。如果我们想要搜索字符串中的所有字母而不考虑大小写,我们可以使用 str.lower()
方法将字符串转换为全小写。
让我们尝试使用字符序列 likes
和 str.count()
:
likes = "Sammy likes to swim in the ocean, likes to spin up servers, and likes to smile."
print(likes.count("likes"))
3
在字符串 likes
中,等效于 “likes” 的字符序列在原始字符串中出现了3次。
我们还可以找出字符或字符序列在字符串中的位置。我们可以使用 str.find()
方法来实现这一点,它将根据索引号返回字符的位置。
我们可以查看字符串 ss
中第一个 “m” 的位置:
print(ss.find("m"))
2
字符串 “Sammy Shark!” 中字符 “m” 的第一个位置是索引号2。
让我们看一下字符串 likes
中第一个字符序列 “likes” 的位置:
print(likes.find("likes"))
6
字符序列 “likes” 的第一次出现位置是在索引号位置6,这是序列 likes
的字符 l
的位置。
如果我们想要查看第二个 “likes” 序列的开始位置,我们可以通过向 str.find()
方法传递第二个参数来指定从特定索引号开始。因此,我们不是从字符串的开头开始,而是从索引号9开始:
print(likes.find("likes", 9))
34
在这第二个例子中,从索引号9开始,字符序列 “likes” 的第一个出现位置是在索引号34。
此外,我们还可以指定范围的结束作为第三个参数。与切片一样,我们可以通过使用负索引号以逆序计数来进行反向计数:
print(likes.find("likes", 40, -6))
64
此示例中的最后一个参数在索引号40和-6之间搜索序列 “likes”的位置。由于输入的最后一个参数是负数,它将从原始字符串的末尾开始计数。
len()
、str.count()
和 str.find()
的字符串方法可用于确定字符串的长度、字符或字符序列的计数以及字符或字符序列在字符串中的索引位置。
结论
能够调用字符串的特定索引号,或者调用字符串的特定切片,使我们在处理此数据类型时具有更大的灵活性。因为字符串、列表和元组等都是基于序列的数据类型,所以可以通过索引和切片进行访问。