python的切片(slice)机制

在python编程中,我们经常要取list或者tuple里面的元素,或者对字符串进行处理,这恰恰也是python的一个闪光点,它的切片(slice)机制,使得我们处理这类问题变得简单灵活。

“切片”是针对列表(list)、元组(tuple)的,另外,字符串也可以当作特殊的list,通过切片,可以很轻易的实现截取字符串、反转字符串的操作。

所谓的切片,就是按照你的规则,将一个列表切成另外一个列表,先来直观感受一下。

list = ["lookfor404","lipengfei","hello","what"]
list1 =list[0:2:2]
print list1

你猜输出什么?输出了一个新的列表['lookfor404']

假如是这样呢?又会输出什么?

list = ["lookfor404","lipengfei","hello","what"]
list1 =list[0:2:1]
print list1

答案是['lookfor404', 'lipengfei']

现在就来解释一下。切片的使用就是这么简单,在一个list后面加个中括号,里面有两个冒号,插空有3个参数。

list[first_index:last_index:step]

这个表示,从这个list的first_index开始,到last_index结束(不包括last_index本身),以step步长来截取这个list

回到刚才的例子,由于list = ["lookfor404","lipengfei","hello","what"],这个list有4个元素,而list1 =list[0:2:2]表示的是,从list的第0个元素(lookfor404)开始,到第2个元素(hello)结束,以步长2来截取list,这里要注意的是,前两个参数0和2,在数学上是个半闭半开的区间:[0,2)。所以,很自然的,可以得到list1的结果就是['lookfor404']

当然,并不是一定要用两个冒号,如果只使用了一个冒号,就意味着步长默认为1。以上是常规用法,下面拓展一下,其实它很强大,所以python不需要一些字符串的截取函数了。

比如————
复制list,可以直接这样

list = ["lookfor404","lipengfei","hello","what"]
list1 =list[:]

list1就复制了list的内容过来了,因为冒号两边不填参数的话,就默认从0到最后一个元素(包括最后一个元素)。

再比如————
反转字符串,可以这样

str = "helloworld"
str1 =str[::-1]

此时输出str1就是'dlrowolleh'。原因在于步长参数,我们选择了负数,没错,负数就表示反着来,-1表示倒序,-2表示隔着步长2倒序,也就是说,如果str1 =str[::-2],那么输出str1为'drwle'

最后对边界进行一个总结,直接上代码:

s = ["a","b","c","d"]       # s的上界为0,下界为 4(事实上,最后一个元素的索引为3,但这里称4为下界)
s[-100:100]       #返回 [1,2,3,4] :-100超出了上界,100超出了下界:等价于 s[0:4]
s[-100:-200]      #返回 [] :-100,-200均超出了上界,自动取上界:等价于s[0:0]
s[100:200]        #返回 [] :100,200均超出了下界,自动取下界值:等价于s[4:4]
s[:100]           #返回 [1,2,3,4] :开始值省略表示从第0个开始,等价于s[0:4]
s[0:]             #返回 [1,2,3,4] :结束值为空表示到最后一个结束,等价于s[0:4]

发表评论

电子邮件地址不会被公开。 必填项已用*标注