python切片详解——[a::-1]、 [:b:-1]、 [::-1]的使用

目录

切片

作用:处理列表的部分元素

用切片复制列表

 Python可切片对象的索引方式

切片的参数

 step:正负数均可,其绝对值大小决定了切取数据时的‘‘步长”,而正负号决定了“切取方向”,正表示“从左往右”取值,负表示“从右往左”取值。当step省略时,默认为1,即从左往右以步长1取值。

[a::-1]的使用

[:b:-1]的使用

[::-1] 的使用


 

切片

作用:处理列表的部分元素

代码:

list=[1,2,3,4,5,6,7,8,9]
print(list[1:5])

 

输出:

[2, 3, 4, 5]

特点:左闭右开,[1:5]代表索引1、2、3、4的元素。

如果没有指定第一个参数,自动从头开始。

代码:

list=[1,2,3,4,5,6,7,8,9]
print(list[:5])

 

输出:

[1, 2, 3, 4, 5]

同理如果没有指定第二个参数,自动到末尾结束。


用切片复制列表

那么如何用切片复制一个列表呢?

 

代码:

list=[1,2,3,4,5,6,7,8,9]
list_1=list[2:5]
print(list)
print(list_1)

 

输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9]
[3, 4, 5]

当我们复制列表不用切片,而直接赋值时:

list=['cat','dog','pig']
list_1=list
list.append('1')
list_1.append('2')
print(list)
print(list_1)

 

输出:

['cat', 'dog', 'pig', '1', '2']
['cat', 'dog', 'pig', '1', '2']

原本我们想得到的结果是在list列表中加上1,在list_1列表中加上2,然而得到的结果却是相同的。

这是因为这样实际上是让python将新变量(也就是list_1)关联原来的列表。当你用list_1列表或原来的list列表时实际上指向的是同一个列表。


 Python可切片对象的索引方式

包括:正索引和负索引两部分,如下图所示,以list对象a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]为例:

python切片详解——[a::-1]、 [:b:-1]、 [::-1]的使用

 下面以实例说明负索引的使用:

list=[1,2,3,4,5,6,7,8,9]
print(list[:-4])

 

输出:

[1, 2, 3, 4, 5]

 

[:-4]代表着索引为0、1、2、3、4的元素,也就是从第一个元素到倒数第5个。


切片的参数

切片操作基本表达式:object[start_index:end_index:step]

 step:正负数均可,其绝对值大小决定了切取数据时的‘‘步长”,而正负号决定了“切取方向”,正表示“从左往右”取值,负表示“从右往左”取值。当step省略时,默认为1,即从左往右以步长1取值。

step为正数时

代码:

list=[1,2,3,4,5,6,7,8,9]
print(list[:6:2])

 

 输出:

[1, 3, 5]

 step=2代表从头开始每隔2个元素取一次值。

step为负数时

代码:

list=[1,2,3,4,5,6,7,8,9]
print(list[1:6:-1])

 

输出:

[]

 输出为空列表,说明没取到数据,这是因为step=-1,决定了从右往左取值,而start_index=1到end_index=6决定了从左往右取值,两者矛盾,所以没有取到值。


[a::-1]的使用

代码:

list=[1,2,3,4,5,6,7,8,9]
print(list[4::-1])

 

输出:

[5, 4, 3, 2, 1]

 当step为负数时,end_index默认为第一个数,所以从右往左取值,从start_index=4开始,一直取到“起点”1。

[:b:-1]的使用

代码:

list=[1,2,3,4,5,6,7,8,9]
print(list[:4:-1])

 

 输出:

[9, 8, 7, 6]

 当step为负数时,start_index默认为最后一个数,所以从右往左取值,从“终点”值9开始,一直取到end_index=4(不包括该点)。

[::-1] 的使用

代码:

list=[1,2,3,4,5,6,7,8,9]
print(list[::-1])

 

输出:

[9, 8, 7, 6, 5, 4, 3, 2, 1]

 当start_index和end_index都不传入值时,而step为负,那么start_index默认为最后一个数,end_index默认为第一个数,所以从最后一个数从右往左取值一直到第一个数。

 

下面我们以一道题来说明:

编写函数, 接收一个列表(包含10个整形数)和一个整形数k, 返回一个新列表.
     函数需求:
        - 将列表下标k之前对应(不包含k)的元素逆序;
        - 将下标k及之后的元素逆序;

代码:

def fun (list,k):
	if k<0 or k>len(list):
		return 'Error'
	else:
		list1=list[k:]
		list2=list1[::-1]
		list3=list[:k]
		list4=list3[::-1]
		return list4+list2
list=[1,2,3,4,5,6,7,8,9,10]
print(list)
print(fun(list,3))

输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[3, 2, 1, 10, 9, 8, 7, 6, 5, 4]

上一篇:为什么String类是不可变的?


下一篇:无限循环和用户输入作为终止