Python 中序列的索引与分片

本文详细介绍了Python中序列的基本操作——索引与分片,并通过实例展示了如何使用这些操作来访问和修改序列中的元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 索引(index)

  python 中常用的序列有列表(list),元组(tuple)与字符串。对于 python 中的序列,可以使用索引来访问其成员,得到的结果是单个元素。其形式为 seq[index] 。另外 python 中的索引可以使用负整数来表示,最后一个元素使用负索引为 -1,向前依次递减。  

>>>l = [1, 4, 7, 2, 5, 8, 3, 6, 9]
>>>l[0]
1
>>>l[1]
4
>>>l[-1]
9
>>>l[-2]
6

2. 分片(slice)

  python 中序列的分片可用于访问一批序列元素,得到的结果是个序列。其形式为 seq[start:[end[:step]]] 。这个写法模仿自 python 方法声明中的非必须参数,在这里意指 endstep 根据语法可有可无。这样算来分片的形式就多得多了,根据分片中参数的个数,可知总的分片情况共有3种可能。

  • 1). seq[start:] : 这种形式下分片所得结果为从 start 开始直到序列尾部的所有元素。
>>>l = [1, 4, 7, 2, 5, 8, 3, 6, 9]
>>>l[0:]
[1, 4, 7, 2, 5, 8, 3, 6, 9]
>>>l[-1:]
[9]
  • 2). seq[start:end]:这种形式下分片所得结果为从 start 开始直到 end (不包括 end) 的所有元素( end 超出序列最大索引时以最大索引计)。这种形式下存在三种可能,分别是 start < endstart = end 以及 start > end
>>>l = [1, 4, 7, 2, 5, 8, 3, 6, 9]
>>>l[0:2]  # start < end
[1, 4]
>>>l[0:0]  # start = end
[]
>>>l[2:0]  # start > end
[]

  上面的第二、三种情况的结果倒也好理解,第二种情况是要取从索引 0 开始,而又不包括索引 0 的所有元素,明显是取不到,所以结果为空。第三种情况就更好说了从索引 2 处开始,向后直到索引 0 处结束的所有元素,结果自然也是空。这两种情况取不到元素,貌似用不到。其实不然,这两种情形有个很有意思的用处。  

>>>l = [2, 5, 8]
>>>l[0:0] = [1, 4, 7]
>>>l
[1, 4, 7, 2, 5, 8]
>>>l[6:0] = [3, 6, 9]
>>>l
[1, 4, 7, 2, 5, 8, 3, 6, 9]

  其实这也就是说在分片中仅有 startendstart <= end 的情况下,可以使用这种分片形式在原序列中从索引位置为 start 处开始插入一个新的序列中的所有元素。举个例子来说, list 中的 extend 方法可以在列表尾部直接插入一个序列中的所有元素。假如需要在在头部也实现这样的方法,则可以定义 extendleft 如下:

>>>def extendleft(seq, new_seq):
...    seq[0:0] = new_seq
...
>>>l = [2, 5, 8]
>>>l.extend([3, 6, 9])
>>>l
[2, 5, 8, 3, 6, 9]
>>>extendleft(l, [1, 4, 7])
>>>l
[1, 4, 7, 2, 5, 8, 3, 6, 9]
  • 3). seq[start:end:step]:这种形式与上面的不同之处就在于多了个表示步长的 step 参数。这个 step 可为正或负,不可为零。为正时表示向后取元素时每隔 step 位取上一个,为负时则表示向前取元素时每隔 step 位取上一个。
>>>l=[1, 4, 7, 2, 5, 8, 3, 6, 9]
>>>l[0:8:2]
[1, 7, 5, 3]
>>>l[0:8:-2]
[]
>>>l[8:0:-2]
[9, 3, 5, 7]
>>>l[8:0:2]
[]

  这种情况下, step 的正负性决定是向前还是向后取元素,step 的绝对值大小决定了每隔几位取一个序列成员(step 为1表示下一个元素,2表示下下一个元素,依次类推)。  

3. slice (Python class, in 2. Built-in Functions)

  python 中内置了 slice 类,它用于创建分片对象供序列使用。也就是说通过分片访问序列元素,可以使用 seq[s](s是一个slice对象)。
  slice 类有两种可用形式,分别为 class slice(stop)class slice(start, stop[, step])

>>>l = [1, 4, 7, 2, 5, 8, 3, 6, 9]
>>>s = slice(3)
>>>s
slice(None, 3, None)
>>>l[s]
[1, 4, 7]
>>>s = slice(0, 8, 2)
>>>l[s]
[1, 7, 5, 3]
>>>l[0:8:2]
[1, 7, 5, 3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值