Python中的序列切片(第2节)


在前面的教程中,已经简单介绍了“列表”和“字符串”的切片操作。切片是Python序列的重要操作之一,所有的序列类型都可以进行切片操作。例如:

动手练一练:

# 列表
a = [5, 6, 7, 8]
print('列表')
print(a[0:2]) # 输出[5, 6]
print(a[2:3]) # 输出[7]

print('------这是虚线------')

# 元组
b = (5, 6, 7, 8)
print('元组')
print(b[0:2]) # 输出(5, 6)
print(b[2:3]) # 输出(7,),如果元组只有一个元素,则这个元素后面必须有“,”。

print('------这还是虚线------')

# 字符串
c = "5678"
print('字符串')
print(c[0:2]) # 输出56
print(c[2:3]) # 输出7

执行以上代码,输出结果为:

列表
[5, 6]
[7]
------这是虚线------
元组
(5, 6)
(7,)
------这还是虚线------
字符串
56
7

上面的例子中切片能够帮助我们取出一个范围对应的元素,切片操作的实现需要提供两个索引作为边界(默认是左闭右开的区间),第一个索引的元素包含在切片内(闭区间),第二个索引的元素不包含在切片内(开区间)。切片在数学上的区间范围表示为“[a,b)” ,切片内容满足这个区间,a是切片的第一个参数,b是切片的第二个参数,b不包含在切片中。

在序列中,索引不仅可以从左往右编号,还可以从右往左编号,负数代表从右往左编号。需要注意的是,从右往左编号是从-1开始的。例如:

动手练一练:

# 列表
a = [5, 6, 7, 8, 9]
print('列表')
print(a[-3:4]) # 输出 [7, 8]

print('------这是虚线------')

# 元组
b = (5, 6, 7, 8, 9)
print('元组')
print(b[-3:4]) # 输出 (7, 8)

print('------这还是虚线------')

# 字符串
c = "56789"
print('字符串')
print(c[-3:4]) # 输出 78

执行以上代码,输出结果为:

列表
[7, 8]
------这是虚线------
元组
(7, 8)
------这还是虚线------
字符串
78

上面例子中序列的索引方式如下表所示:

序列 5 6 7 8 9
正索引 0 1 2 3 4
负索引 -5 -4 -3 -2 -1

在序列中,当序列的索引下标超出其真实的索引长度时,Python会自动将其截断到合法的范围内。例如,如果我们有一个长度为4的序列,但是我们却使用了索引范围为0~10的切片,Python会自动将其转换为范围为0~3的切片。这种行为不会报错,同时也很方便地允许我们处理一些不确定长度的数据。

动手练一练:

# 列表
a = [5, 6, 7, 8]
print('列表')
print(a[0:10]) # 输出 [5, 6, 7, 8]

print('------这是虚线------')

# 元组
b = (5, 6, 7, 8)
print('元组')
print(b[0:10]) # 输出 (5, 6, 7, 8)

print('------这还是虚线------')

# 字符串
c = "5678"
print('字符串')
print(c[0:10]) # 输出 5678

执行以上代码,输出结果为:

列表
[5, 6, 7, 8]
------这是虚线------
元组
(5, 6, 7, 8)
------这还是虚线------
字符串
5678

在所有的序列切片中,书写格式为:[第一个参数:第二个参数],使用冒号分隔两个参数,第一个参数也可以不指定,会默认为0,也就是从序列的开头进行切片。如果第二个参数不指定,则默认值是序列的最后(包含最后一个元素)。如果两个参数都设置为空,则可以获取整个序列,例如:

动手练一练:

# 列表
a = [5, 6, 7, 8]
print('列表')
print(a[2:]) # 输出[7, 8]
print(a[:2]) # 输出[5, 6]
print(a[:]) # 输出[5, 6, 7, 8]

print('------这是虚线------')

# 元组
b = (5, 6, 7, 8)
print('元组')
print(b[2:]) # 输出(7, 8)
print(b[:2]) # 输出(5, 6)
print(b[:]) # 输出(5, 6, 7, 8)

print('------这还是虚线------')

# 字符串
c = "5678"
print('字符串')
print(c[2:]) # 输出78
print(c[:2]) # 输出56
print(c[:]) # 输出5678

执行以上代码,输出结果为:

列表
[7, 8]
[5, 6]
[5, 6, 7, 8]
------这是虚线------
元组
(7, 8)
(5, 6)
(5, 6, 7, 8)
------这还是虚线------
字符串
78
56
5678