python列表的切片操作是通过指定开始索引和结束索引截取原列表的一部分生成一个新的列表,它的一般形式为 [start:end),左闭右开,在实际截取时索引为end的元素不会被截取到新列表中。
lst = [3, 4, 1, 4, 2, 5, 8]
lst1 = lst[3:6]
print(lst1)
程序输出结果为
[4, 2, 5]
切片操作的一般模式是[start:end],shart 和 end 所指的都是索引,截取时,end索引位置的元素不会被截取,这一点尤其要注意,比如上面的示例中
lst1 = lst[3:6]
索引为6的元素是8,8没有出现在结果里,截取范围是3到6,6-3=3,最终切片截取的列表长度也正好是3
在使用切片时,也可以使用倒序索引
lst = [3, 4, 1, 4, 2, 5, 8]
lst1 = lst[2:-2]
print(lst1)
程序输出结果
[1, 4, 2]
lst = [3, 4, 1, 4, 2, 5, 8]
lst1 = lst[2:]
print(lst1)
如果不指定结束位置,那么切片操作会从开始位置截取到列表末尾,程序输出结果为
[1, 4, 2, 5, 8]
lst = [3, 4, 1, 4, 2, 5, 8]
lst1 = lst[:5]
print(lst1)
如果不指定开始位置,那么默认开始位置为0,程序输出结果为
[3, 4, 1, 4, 2]
lst = [3, 4, 1, 4, 2, 5, 8]
lst1 = lst[:11]
print(lst1)
上面的代码中,结束位置的索引设置为11,显然已经超出了列表索引的范围,但是却没有引发错误,对于这种情况,切片操作自身做了处理,如果结束位置的索引超出索引范围,那么就以列表长度作为结束位置
不论是字符串的切片操作还是列表的切片操作,即使指定了切片范围的结束索引,切片操作生成的新对象也不会包括结束索引位置的元素,切片的索引范围是左闭右开的,这在第一小节里做了介绍。本节要讨论的是,为什么有这样的设定和要求,包含结束索引位置的元素就不行么?
之所以要求切片索引范围做到左闭右开,根本原因在于索引是从0开始的,左闭右开将有如下好处:
关于切片间隔,已经在字符串切片操作做过讲解,本文不做赘述,只给出示例代码,想要了解切片间隔,可以去看这篇文章。
lst = [1, 2, 3, 4, 5]
print(lst[::-2]) # [5, 3, 1]
print(lst[::-1]) # [5, 4, 3, 2, 1]
lst = [2, 3, 4, 1, 5, 2, 7, 1, 8, 9, 10, 31, 22, 34]
上面定义了一个列表,现在要求你从第一个元素开始,每三个一组求和,将所求得的和放入新列表sum_lst
示例代码
lst = [2, 3, 4, 1, 5, 2, 7, 1, 8, 9, 10, 31, 22, 34]
step = 3
sum_lst = []
for i in range(0, len(lst), step):
tmp = lst[i: i+step]
sum_lst.append(sum(tmp))
print(sum_lst)
QQ交流群: 211426309