0%

Python之slice切片的高级用法

这里介绍Python中slice切片的高级用法

abstract.png

命名切片

slice切片是Python的内置类,可通过slice()函数来创建切片对象。用法如下所示

1
2
3
4
5
6
7
8
# 该切片对象会提取0(包含)开始到end(不包含)的所有元素
s1 = slice(end)

# 该切片对象会提取start(包含)开始到end(不包含)的所有元素
s2 = slice(start, end)

# 该切片对象会提取start(包含)开始到end(不包含)的所有元素,其中步长为step
s2 = slice(start, end, step)

特别地:

  • start、step如果未显式指定,默认为None
  • 如果 start 为 None,则从0开始
  • 如果 step 为 None,步长为1;
  • 如果 end 为 None, 则会包含最后一个位置的元素
1
2
3
4
5
6
7
8
9
10
11
12
13
print("-------------命名切片----------------------------")
stu_tuple_1 = ("Aaron", "Man", "四年级", "一班", 66,77,88)
stu_tuple_2 = ("Bob", "female", "二年级", "三班", 60,70)

# 学生信息切片对象
student_info_slice = slice(2)
# 班级信息切片对象
class_info_slice = slice(2,4)
# 考试分数信息切片对象
score_info_slice = slice(4,None)

print(f"stu1 -> student: {stu_tuple_1[student_info_slice]}, class: {stu_tuple_1[class_info_slice]}, score: {stu_tuple_1[score_info_slice]}")
print(f"stu2 -> student: {stu_tuple_2[student_info_slice]}, class: {stu_tuple_2[class_info_slice]}, score: {stu_tuple_2[score_info_slice]}")

figure 1.png

切片位于赋值语句左侧

事实上,切片还可以位于赋值语句左侧。实现对原数据容器的修改、嫁接、切除等操作

修改

1
2
3
4
5
# 原地修改
list1 = list(range(10))
print(f"list 1: {list1}")
list1[2:5] = [20,30,40]
print(f"list 1: {list1}")

figure 2.png

嫁接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 嫁接
list2 = list(range(5))
print(f"list 2: {list2}")
list2[5:] = [555,666,777]
print(f"list 2: {list2}")

print("-----------------------------------")

list3 = list(range(5))
print(f"list 3: {list3}")
# 当赋值的对象是一个切片时,则赋值语句的右侧必须是个可迭代对象。即便只有一个值,也要把它转换成可迭代的序列
# 故下述代码不可以写成:list2[2:5] = 1000
list3[2:5] = [1000]
print(f"list 3: {list3}")
list3[1:1] = [-1,-2,-3]
print(f"list 3: {list3}")

figure 3.png

切除

1
2
3
4
5
6
7
# 切除
list4 = list(range(8))
print(f"list 4: {list4}")
del list4[0:3]
print(f"list 4: {list4}")
list4[-2:] = []
print(f"list 4: {list4}")

figure 4.png

参考文献

  1. Python编程·第3版:从入门到实践 Eric Matthes著
  2. Python基础教程·第3版 Magnus Lie Hetland著
  3. 流畅的Python·第1版 Luciano Ramalho著
请我喝杯咖啡捏~
  • 本文作者: Aaron Zhu
  • 本文链接: https://xyzghio.xyz/SliceOfPy/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-ND 许可协议。转载请注明出处!

欢迎关注我的微信公众号:青灯抽丝