需求:一条语句从(0,1,2,3,4,5,6,7,8,9,10)中取出(7,5,3)

分析:可以使用Python的切片功能。

完整用法:iteratableObj[startIndex:endIndex:step]

其中iteratableObj可以是list, tuple,其他的我就不清楚了。(没去查官方文档= =)

然后startIndex为包含性的从0开始的元素编号,表示切片的开始位置;endIndex为非包含性的从0开始的元素编号,表示切片的结束位置;step表示步进,即每次前进多少个元素,默认为1。

这些数字如果是负数的话,也是有特定含义的,会被Python解释器认为是反向编址的序号,即常说的倒数第几个。相应地,step处的负号会让整个列表翻转。然后这里就涉及了一个很有意思的问题:同时进行切片和翻转,到底谁先谁后?也就是说,startIndexendIndex到底应该是填顺序的还是反序的?

经过实践,发现顺序如下:

  1. 先检查step的符号,如果为负,翻转列表(也可能是将读取顺序标记为反序)
  2. 按照startIndexstep开始选取元素,以endIndex为界限(不包含)。这里的两个index都还是顺序的!

于是上文的题目解答如下:

arr = (0,1,2,3,4,5,6,7,8,9,10)
print(arr[7:2:-2]) # or print(arr[-4:-9:-2])

千万要记住这里的第二个地址还是不包含的,所以一定要多顺着方向将地址+1!

标签: none

添加新评论