切片的格式:对象[起始位置:终止位置:步长]
(左闭右开,起始和终止可以省略不写)
偏移量:从列表第一个元素开始,其偏移量为0,接着递增。
# 切片是对序列截取一部分的操作
# 字符串、列表、元组都支持切片操作
l1 = [i for i in range(10)]
print(l1)
# —— [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(l1[2])    # 输出2
# —— 2
# 长切片
# 格式:对象[start : end : step],左闭右开.start省略代表从0开始,end省略代表包括最后,步长省略代表步长为1
print(l1[2:7])    # 第三个到第七个
# —— [2, 3, 4, 5, 6]
print(l1[2:])    # 扔了前面两个,取第三个到最后
# —— [2, 3, 4, 5, 6, 7, 8, 9]
print(l1[0:4:2])    # =第一个到第四个,步长2
# —— [0, 2]
print(l1[0:-2])    # 0到倒数第三个
# —— [0, 1, 2, 3, 4, 5, 6, 7]
print(l1[-4:-2])    # 倒数第四和倒数第三个
# —— [6, 7]
print(l1[-4:2])    # 倒数第四到正第三个,无
# —— []
print(l1[-1:-3:-1])    # 倒数第一到倒数第二个,逆序
# —— [9, 8]
print(l1[-1:1:-1])    # 倒数第一到第三个,逆序
# —— [9, 8, 7, 6, 5, 4, 3, 2]
print(l1[3:1:-1])    # 第四个和第三个,逆序
# —— [3, 2]
print(l1[3:-3:-1])    # 第四个到倒数第2个,逆序,无
# —— []
print(l1[::])    # 全取
# —— [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(l1[:])    # 全取
# —— [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(l1[::2])    # 全取,步长2
# —— [0, 2, 4, 6, 8]
print(l1[::-1])    # 列表倒序
# —— [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
总结:正序取,步长也要正;逆序取,步长也要逆;否则为空,啥都切不到。
- 对可迭代内容(字符串、列表、字典等)使用切片来原地修改列表的内容(少用)
 
a = [3, 5, 7]
print(len(a))
# —— 3
# a[len(a):] = 9
# —— TypeError: can only assign an iterable
# -----------------------
# 切片形式插入序列——字符串
a = [3, 5, 7]
a[len(a):] = '9'
print(a)
# —— [3, 5, 7, '9']
# -----------------------
# 切片形式插入序列——元组
a = [3, 5, 7]
a[len(a):] = (9)
print(a)
# —— TypeError: can only assign an iterable
# -----------------------
# 切片形式插入序列——单元素(列表)
a = [3, 5, 7]
a[len(a):] = [9]
print(a)
# —— [3, 5, 7, 9]
# -----------------------
# 切片形式插入序列——多元素(列表)
a = [3, 5, 7]
a[len(a):] = [9, 11]
print(a)
# —— [3, 5, 7, 9, 11]
# -----------------------
# 切片形式插入序列——集合
a = [3, 5, 7]
a[len(a):] = {9}
print(a)
# —— [3, 5, 7, 9]
# -----------------------
# 切片形式插入序列——字典
a = [3, 5, 7]
a[len(a):] = {'999': 11}
print(a)
# —— [3, 5, 7, '999']
# ***拓展***
# -----------------------
a = [3, 5, 7, 9]
a[:3] = [1, 2, 3]   # 用1,2,3代替3,5,7
print(a)
# —— [1, 2, 3, 9]
# -----------------------
a = [3, 5, 7, 9]
a[:3] = []    # 用[]代替1,2,3
print(a)
# —— [9]
- (回顾)从列表提取单个元素:
 
students = ['小明','小红','小刚']
print(students[0])
print(students[1])
print(students[2])
——小明,小红,小刚
- (回顾)从列表提取多个元素(切片):
 
list2 = [5,6,7,8,9]
print(list2[:])    切片两边没数字——全要
print(list2[2:])   切片左边有数字——切了左边
print(list2[:2])   切片右边有数字——切了右边
print(list2[1:3])  切片两边有数字——从左开始右不取
print(list2[2:4])  切片两边有数字——从左开始右不取
——[5,6,7,8,9]
  [7,8,9]
  [5,6,7]
  [6,7]
  [7,8]
【练习】提取列表中字典的名字和年龄
l1 = [{'name': '张三', 'age': 56},
      {'name': '李四', 'age': 90},
      {'name': '王五', 'age': 6},
      {'name': '赵六', 'age': 33},
      {'name': '田七', 'age': 67},
      {'name': '老八', 'age': 12}
      ]
# 取前三个
print(l1[:3])
# 分别取出每个字典中的名字
print(x['age'] for x in l1[:4])
print(x['name'] for x in l1[:4])
[{'name': '张三', 'grade': 56}, {'name': '李四', 'grade': 90}, {'name': '王五', 'grade': 6}]
['张三', '王五', '赵六', '田七']
[56, 90, 6, 33]