通用序列操作
约 1327 字大约 4 分钟
2025-04-04
序列类型是由一串对象(包括字面值,类对象,甚至序列本身)按顺序存储的数据结构,Python 的序列类型有列表、元组、range,以及字符串序列和二进制序列
通用序列操作
参考:https://docs.python.org/zh-cn/3.13/library/stdtypes.html#common-sequence-operations
大多数序列类型,包括可变类型和不可变类型都支持下表中的操作。 collections.abc.Sequence
ABC 被提供用来更容易地在自定义序列类型上正确地实现这些操作。
此表按优先级升序列出了序列操作。 在表格中,s 和 t 是具有相同类型的序列,n, i, j 和 k 是整数而 x 是任何满足 s 所规定的类型和值限制的任意对象。
in
和 not in
操作具有与比较操作相同的优先级。 +
(拼接) 和 *
(重复) 操作具有与对应数值运算相同的优先级(必须如此,因为解析器无法判断操作数的类型)。
运算 | 结果: | 备注 |
---|---|---|
x in s | 如果 s 中的某项等于 x 则结果为 True ,否则为 False | (1) |
x not in s | 如果 s 中的某项等于 x 则结果为 False ,否则为 True | (1) |
s + t | s 与 t 相拼接 | (6)(7) |
s * n 或 n * s | 相当于 s 与自身进行 n 次拼接 | (2)(7) |
s[i] | s 的第 i 项,起始为 0 | (3) |
s[i:j] | s 从 i 到 j 的切片 | (3)(4) |
s[i:j:k] | s 从 i 到 j 步长为 k 的切片 | (3)(5) |
len(s) | s 的长度 | |
min(s) | s 的最小项 | |
max(s) | s 的最大项 | |
s.index(x[, i[, j]]) | x 在 s 中首次出现项的索引号(索引号在 i 或其后且在 j 之前) | (8) |
s.count(x) | x 在 s 中出现的总次数 |
索引(下标)
索引又称下标,用来表示可迭代对象中的某个元素的位置。
- 用正整数表示的索引值,从左向右定位,从 0 开始计数,如 0,1,2
- 用负整数表示的索引值,从右向左定位,从 -1 开始计数,如 -1,-2,-3
例如:
name = "Sure" # 从 0 开始数
#0123 (索引值|下标值) 从左向右
#-4-3-2-1 从右向左
print(name[2]) # r
print(name[-4]) # S
切片
有这样一个字符串:bob_alice_tom
,我们想要把其中的 alice
取出来,该怎么做呢?一个可行的方法是,分别用 a
、l
、i
、c
和 e
的索引值,把它们分别取出来,再利用字符串的加和操作把它们拼接起来,就像这样:
name = 'bob_alice_tom'
a = name[4] # a
b = name[5] # l
c = name[6] # i
d = name[7] # c
e = name[8] # e
print(a + b + c + d + e) # 拼接并打印字符串
当然也可以通过循环的方法来取出相应的字符,然后拼接成新的字符串:
name = 'bob_alice_tom'
i = 4
s = ''
while i <= 8:
s += name[i]
i += 1
print(s)
因为这样的循环在 Python 中非常常用,所以被封装成为了一种简便的方法,就是字符串的 切片
。切片的基本格式和使用方法如下:
name = 'bob_alice_tom'
# 0123456789
print(name[4:9]) # [起始位置:终止位置] 顾头不顾腚(起始位置保留,终止位置不保留)-> alice
print(name[-3:]) # [起始位置:终止位置(默认到结尾)] 顾头不顾腚 -> tom
print(name[:]) # [起始位置(默认从开头):终止位置(默认到结尾)] 顾头不顾腚 -> bob_alice_tom
关于切片的终止位置的选择,还有一个技巧是:终止位置 = 起始位置 + 切片长度
。例如上面的例子中,起始位置为 4
,切片长度为 5
,终止位置为 4 + 5 = 9
。
有的时候我们并不想要一个一个取字符,而是要隔一个字符取一个。比如对于上面 'bob_alice_tom'
的例子,我们想要取第 3
、5
、7
位的 b
、a
、i
,该如何操作呢?
我们依旧可以使用最原始的,分别取值,然后拼接字符串的方法:
name = 'bob_alice_tom'
a = name[2]
b = name[4]
c = name[6]
print(a + b + c)
这种方法确实能得到我们想要的结果,但是太过繁琐。如果我们想要处理很长的字符串,就会非常麻烦了。这就需要我们在切片时引入 步长
变量。步长
是使用切片方法的第三个参数,默认值为 1
。对于上面的例子,我们可以设置 步长
为 2
:
name = 'bob_alice_tom'
#0123456789
#-6-5-4-3-2-1
print(name[2:7:2]) # [起始位置:终止位置:步长(默认为1)] -> bai
如果我们把步长设置成 -1,可以实现从右向左查找:
name = 'bob_alice_tom'
print(name[-1:3:-1]) # 步长可以控制查找方向 -> mot_ecila
在进行索引操作时,如果输入的参数超过最大索引值时,程序会报错。而在进行切片操作时,如果终止位置超出最大索引值时,程序不会报错,而是会走到字符串的结尾:
name = 'bob_alice_tom'
print(name[2:20:2]) # baietm
需要注意的是,索引和切片只能给有序数据(字符串、列表、元组)使用。整型和布尔值等均不可以用来进行索引和切片操作
版权所有
版权归属:Shuo Liu