Python 中序列的索引与分片

来源:互联网 发布:qrcode 生成算法 编辑:程序博客网 时间:2024/05/16 14:05

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)>>>sslice(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]
0 0
原创粉丝点击