Python中的切片容易混淆,这里总结一下自己的看法
切片的语法
1 | a = [1,2,3,4] | ||
2 | x = a[1:2] #实际上执行的是 a.__getitem__(slice(1,2,None)) | ||
1 | slice([start], stop[, step] | ||
2 |
| |
3 | step的符号表示一种方向的含义 |
4 | +:从左向右看,start默认是0,stop默认是索引最大值 |
5 | -:从右向左看,start默认是索引最大值,stop默认是0 |
1 | 1.先看第三个参数,如果该数为正,则从前往后数,如果为负,则从后往前数,如果非1,则是跳步来数(1表示走一步,跳0步) | |
2 | 2.PYTHON总是左开右闭的,也就是说第一个参数要包括,第二个参数不包括 |
3 | 3.如果第一个参数没填,则自动设为第一个参数(根据第三个参数的正负判断是整数第一个还是倒数第一个) |
4 | 4.如果第二个参数没填,则自动设定为最后一个参数(根据第三个参数的正负判断是整数第一个还是倒数第一个 |
5 | 另外这个参数不会包括进去【左开右闭】) |
示例
01 | >>> s = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] | |
02 | >>> s[5:0:-1] |
03 | [5, 4, 3, 2, 1] | |
04 | >>> s[5:4:-1] |
05 | [5] | |
06 | >>> s[:3:-1] |
07 | [9, 8, 7, 6, 5, 4] | |
08 | >>> s[0:3:-1] |
09 | [] | |
10 | >>> s[9::-1] |
11 | [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] | |
12 | >>> s[::2] |
13 | [0, 2, 4, 6, 8] |
代码分析
01 | 首先定义 s = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] | |
02 |
|
03 | Python中正索引是从0开始的,负索引从-1开始,索引1对应1, 而索引-1对应9. | |
04 |
|
05 | s[5:0:-1]: 1.step 为负数,从右往左输 | |
06 | 2.从索引 5 开始 到索引0 结束, 但不包括索引0 , 输出为 [5, 4, 3, 2, 1] |
07 |
| |
08 | s[:3:-1]: 1.step 为负数,从右往左输出 |
09 | 2.step 为负数,[start]默认值为索引最大值, 即 9, 那么这个切片等价于s[9:3:-1] |
10 | 3.从索引 9 开始 到索引3 结束, 但不包括索引3 , 输出为[9, 8, 7, 6, 5, 4] |
11 |
| |
12 | s[9::-1]: 1.step 为负数,从右往左输 |
13 | 2.step 为负数,[stop]默认值为0, 那么这个切片等价于s[9:0:-1],输出为[9, 8, 7, 6, 5, 4, 3, 2, 1, 0] | |
14 |
|
15 | s[::2]: 1.step 为正数,从右往左输 | |
16 | 2.step 为正数,start默认是0,stop默认是索引最大值,那么这个切片等价于s[0:9:2 |
17 | 3.step 为2表示走两步, 即中间间隔一个字符, 输出为[0, 2, 4, 6, 8] |
转载于:https://blog.51cto.com/bsbforever/1593708