如何在Python中使用切片

  介绍

这篇文章给大家介绍如何在Python中使用切片,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

<强> 1,切片的基础用法

列表是Python中极为基础且重要的一种数据结构,我曾写过一篇汇总文章(链接见文末)较全面地学习过它。文中详细地总结了切片的基础用法,现在回顾一下:

切片的书写形式:[我+ n: m];其中,我是切片的起始索引值,为列表首位时可省略;我+ n是切片的结束位置,为列表末位时可省略;m可以不提供,默认值是1,不允许为0,当m为负数时,列表翻转。注意:这些值都可以大于列表长度,不会报越界。

切片的基本含义是:从序列的第我位索引起,向右取到后n位元素为止,按m间隔过滤。

li =,(1, 4, 5, 6, 7, 9, 11日,14日,16)      #,以下写法都可以表示整个列表,其中,X 祝辞=,len(李)   李(0:X),==,李(0:),==,李[X],==,李[:],==,李[:],==,李[X - X:],==,李(- X:)      李[1:5],==,(4、5、6、7),#,从1起,取5 - 1位元素   李[1:5:2],==,(4、6),#,从1起,取5 - 1位元素,按2间隔过滤   李[1:],==,[16],#,取倒数第一个元素   李[4:2],==,(9,11),#,从倒数第四起,取2 -(4)=2位元素   李[2],==,李(len(李):2],==,(1,4,5,6,7,9,11),#,从头开始,取2 - (len(李))=7位元素      #,步长为负数时,列表先翻转,再截取   李[::1],==,(16日,14日,11日,9日,7日,6日,5、4、1],#,翻转整个列表   李[::2],==,[1]7 16日,11日,5日,#,翻转整个列表,再按2间隔过滤   李(:5:1),==,[9]16日,14日,11日,#,翻转整个列表,取5 - (len(李))=4位元素   李(:5:3),==,(16日9),#,翻转整个列表,取5 - (len(李))=4位元素,再按3间隔过滤      #,切片的步长不可以为0   李(::0),#,报错(ValueError: slice  step  cannot  be 零)

上述的某些例子对于初学者(甚至很多老手)来说,可能还不好理解。我个人总结出两条经验:(1)牢牢记住公式[我+ n: m],当出现缺省值时,通过想象把公式补全;(2)索引为负且步长为正时,按倒数计算索引位置;索引为负且步长为负时,先翻转列表,再按倒数计算索引位置。

<强> 2,切片是伪独立对象

切片操作的返回结果是一个新的独立的序列(PS:也有例外,参见《Python是否支持复制字符串呢?》)。以列表为例,列表切片后得到的还是一个列表,占用新的内存地址。

当取出切片的结果时,它是一个独立对象,因此,可以将其用于赋值操作,也可以用于其它传递值的场景。但是,切片只是浅拷贝,它拷贝的是原列表中元素的引用,所以,当存在变长对象的元素时,新列表将受制于原列表。

li =, (1,, 2,, 3,, 4]   ls =,李[:]      时间==li  ls  #,真的   id(李),==,id (ls), #,假的   li.append (li [2:4]), #, (1,, 2,, 3,, 4, [3, 4]]   ls.extend (ls [2:4]), #, (1,, 2,, 3,, 4,, 3,, 4]      #,下例等价于判断李长度是否大于8   如果(li [8]):   打印才能(“not  empty")   其他:   打印才能(“empty")      #,切片列表受制于原列表   时间=lo  [1, (1,1), 2, 3]   lp =, lo [2], #, (1), (1, 1))   罗[1].append (1), #, (1), (1, 1, 1),, 2,, 3]   lp  #, (1), (1, 1, 1]]

由于可见,将切片结果取出,它可以作为独立对象使用,但是也要注意,是否取出了变长对象的元素。

<强> 3,切片可作为占位符

切片既可以作为独立对象被“取”出原序列,也可以留在原序列,作为一种占位符使用。

在写《详解Python拼接字符串的七种方式》的时候,我介绍了几种拼接字符串的方法,其中三种格式化类的拼接方法(即%,格式(),模板)就是使用了占位符的思想。对于列表来说,使用切片作为占位符,同样能够实现拼接列表的效果。特别需要注意的是,给切片赋值的必须是可迭代对象。

li =, (1,, 2,, 3,, 4]      #,在头部拼接   李(:0),=,[0],#,[0,,1,,2,,3,,4]   #,在末尾拼接   李(len(李):),=,(5、7),#,[0,1,2,3,4,5,7]   #,在中部拼接   李(六),=,[6],#,[0,1,2,3,4,5,6,7]      #,给切片赋值的必须是可迭代对象   李[1:1],=,6,#,(报错,TypeError:,还要only  assign  an  iterable)   李(:0),=,(9日),#,(9日,0,,1,,2,,3,,4,5,6,7]   李(:0),=,范围(3),#,[0,,1,,2,,9日,0,,1,,2,,3,,4,5,6,7]

上述例子中,若将切片作为独立对象取出,那你会发现它们都是空列表,即李(:0)==李(len(李):)李(六)====[],我将这种占位符称为“纯占位符”,对纯占位符赋值,并不会破坏原有的元素,只会在特定的索引位置中拼接进新的元素。删除纯占位符时,也不会影响列表中的元素。

如何在Python中使用切片