python列表的切片操作

python列表的切片操作是通过指定开始索引和结束索引截取原列表的一部分生成一个新的列表,它的一般形式为 [start:end),左闭右开,在实际截取时索引为end的元素不会被截取到新列表中。

1. 指定开始和结束位置

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]

2. 指定开始位置,不指定结束位置

lst = [3, 4, 1, 4, 2, 5, 8]

lst1 = lst[2:]
print(lst1)

如果不指定结束位置,那么切片操作会从开始位置截取到列表末尾,程序输出结果为

[1, 4, 2, 5, 8]

3. 指定结束位置,不指定开始位置

lst = [3, 4, 1, 4, 2, 5, 8]

lst1 = lst[:5]
print(lst1)

如果不指定开始位置,那么默认开始位置为0,程序输出结果为

[3, 4, 1, 4, 2]

4. 切片操作允许索引超出范围

lst = [3, 4, 1, 4, 2, 5, 8]

lst1 = lst[:11]
print(lst1)

上面的代码中,结束位置的索引设置为11,显然已经超出了列表索引的范围,但是却没有引发错误,对于这种情况,切片操作自身做了处理,如果结束位置的索引超出索引范围,那么就以列表长度作为结束位置

5. 为什么切片操作要求左闭右开

不论是字符串的切片操作还是列表的切片操作,即使指定了切片范围的结束索引,切片操作生成的新对象也不会包括结束索引位置的元素,切片的索引范围是左闭右开的,这在第一小节里做了介绍。本节要讨论的是,为什么有这样的设定和要求,包含结束索引位置的元素就不行么?

之所以要求切片索引范围做到左闭右开,根本原因在于索引是从0开始的,左闭右开将有如下好处:

  1. 如果只指定结束索引,那么很容易就看出切片的长度,比如lst[:3],切片后生成的新列表长度就是3
  2. 如果指定了开始索引和结束索引,那么很容易就能够计算出切片的长度,比如lst[2:7], 切片的长度是7-2 = 5
  3. 左闭右开很容易通过一个索引将列表切分成两份,比如lst[:5] 和 lst[5:]

6. 指定切片间隔

关于切片间隔,已经在字符串切片操作做过讲解,本文不做赘述,只给出示例代码,想要了解切片间隔,可以去看这篇文章。

lst = [1, 2, 3, 4, 5]

print(lst[::-2])    # [5, 3, 1]
print(lst[::-1])    # [5, 4, 3, 2, 1]

7. 切片操作应用示例---分组

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

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案