如何理解python中a[x:y:z]的xyz
总有初学者搞得比较晕
给出一个字符串示例,不是数组。不求完美,只求对初学者有所帮助,能了解少少,即达目的。
a='ABCDEFGHI'
为了方便说明问题,假定字符串a=‘ABCDEFGHI’,长度len(a)=9。
有以下几点说明,应该能理解了,如果有说错,请自己验证。
- a[x:y:z]中,x和y都是索引,z表示取出字符后,再以z为间隔进行二次筛选,z表示:后字符的索引减前字符的索引的差值,z留空时相当于z=1。
- 一个字符串有两套索引。索引为正数时,表示正索引,初始索引0在字符串的最左边。索引为负数时,表示负索引,初始索引-1在字符串的最右边。
- 两套索引可以混合使用,关键在于“索引所指向的字符在哪里”,不要被数值大小迷惑。
- 不管用哪一套索引,取字符时,都是从左往右取,a[前索引:后索引]中,后索引所指的字符必须在前索引所指字符的右边,否则取不出结果。
- python中的[ ]表示“含左不含右”又称“左闭右开”(与数学的符号不同),故a[x:x]总是空值、a[-x:len(a)-x]也为空(式中x是正数),因为都指向字符自身,却又不包含自身。
- a[x:y:z]中,x和y可以留空不写,表示该位置不视为索引,只论字符。x留空时表示取到最左的字符,y留空表示取得最右的字符,注意[ ]依然是左闭右开的。
- x、y、z的值可以超过len(a),即使索引不存在时,python也不会报错,这跟数组索引是不一样的!数组超索引的话会报错的。
看下图,可以一目了然两套索引所指:
正索引 0 1 2 3 4 5 6 7 8
字符串 A B C D E F G H I
负索引 -9 -8 -7 -6 -5 -4 -3 -2 -1
举例:
a[-9:0]=空值,前述第4、5点。
a[0]=a[-9]=a[-8:2]=a[-9:1]=a[0:-8]='A'
a[-6,2]=空值,前述第4点。
a[2:-6]=a[-7:3]='C'
a[8]=a[8:9]=a[8:]=a[-1:]='I',前述第6点
a[:-1]=a[-999:-1]='ABCDEFGH',前述第7点
a[0:9]=a[-0:9]=a[0:]=a[-0:]='ABCDEFGHI'
a[:0]=a[:-9]=a[9:]=空值,前述第6点
a[2:7]='CDEFG'
a[2:7:2]='CEG'
a[2:7:3]='CF',C的索引是2,2+3=5(即F的索引)
- 当字符串长度不固定时,只想取后面的m个字符,应该用负索引,即a[-m:],这应该是最优写法了。
- 当字符串长度不固定时,只想取前面的m个字符,应该用正索引,即a[:m],注意不是a[:m+1],因为正索引是从0开始的。
- 想取中间m到n位置的字符,这里m和n指字符位置,要转换为索引,即a[m-1:n],因为索引从0开始,且[ ]左闭右开
…………
可以用以下代码块来尝试看看结果:
a='ABCDEFGHI'
for i in range(-len(a),len(a)+1):
for j in range(-len(a),len(a)+1):
print('a[',i,':',j,']=',a[i:j])