前言
列表与元组第二弹,本节主要介绍分片
一、分片
分片操作是从序列A中获取一个子序列B,序列A可以称为父序列。从A中获取B需要指定B在A中的开始索引和结束索引,因此分片操作需要制定两个索引。由于字符串可以看作字符的序列,所以可以用序列的资格分片特性截取子字符串。
1、通过分片操作获取一个Url的一级域名和完整域名
url='http://geekori.com'
print(url[8:14])
print(url[8:19])
输出结果:
eekori
eekori.com
在上面的代码中,使用url[8:14]来截取url中的"eekori",其中8和14是url中的两个索引,可以看到两个索引之间要使用(:)分隔。
如果留心,你会发现,索引15并不是“i”的索引,而是“.”的索引,没错,在指定子序列结束索引时,要指定子序列最后一个元素的下一个元素的索引,因此应该指定“.”的索引么不是“i”的索引。
那么如果子序列的最后一个元素,恰好是父序列的最后一个元素该怎么办呢?例如,url的最后一个元素是“m”,如果要截取‘geekori.com’,子序列的结束索引应该如何指定呢?其实子序列的结束索引只要制定父序列最后一个元素的索引加1即可。由于父索引最后一个元素“m”的索引是18,因此要截取“geekori.com”,需要指定结束索引为19,也就是url[8:19]
1、省略子序列的索引
首先看一个用分片截取子序列的例子
2、通过分片操作截取num序列中的某个子序列
num=[1,2,3,4,5,6,7,8]
print(num[3:5])
print(num[0:1])
print(num[5:7])
print([-3:-1])
输出结果:
[4, 5]
[1]
[6, 7, 8]
[6, 7]
2、通过将结束索引设为0,获取一个空序列
num=[1,2,3,4,5,6,7,8]
print(num[-3:0])
#输出结果:
[]
Python语言规定,如果结束索引比开始索引结束的晚,那么就会返回一个空序列,在这里索引0比索引-3出现的晚。如果要使用负数作为索引,并且获取的子序列的最后一个元素与父序列的最后一个元素相同,那么可以省略结束索引,或结束索引用正整数。
3、使用负索引作为开始索引,并省略结束索引
num=[1,2,3,4,5,6,7,8]
print(num[-3:])
print(num[-3:8])
输出结果:
[6, 7, 8]
[6, 7, 8]
4、省略开始索引
num=[1,2,3,4,5,6,7,8]
print(num[:3])
#输出结果:
[1,2,3]
5、省略开始索引和结束索引
省略开始索引和结束索引会复制整个子序列
num=[1,2,3,4,5,6,7,8]
print(num[-:])
#输出结果;
[1,2,3,4,5,6,7,8]
二、设置步长
在对序列分片中,默认的步长是1,也就是说,获取的子序列的元素都是相邻的,如果要获取不相邻的元素,就需要指定步长。例如:要获取1,、3、5的元素作为子序列的元素,就需要将步长设为2.
1、通过改变分片操作的步长,获取元素不相邻的子序列
num=[1,2,3,4,5,6,7,8]
print(num[1:6:2])
#输出结果:
[2, 4, 6]
在上面的代码中,使用num[1:6:2]获取索引为1、3、5的元素作为子序列的元素,其中2是步长,可以看到,开始索引、结束索引和步长都用(:)分隔。
其实,开始索引和结束索引和步长都是可以省略的。
2、省略开始索引和结束索引
num=[1,2,3,4,5,6,7,8]
print(num[:7:2])
print(num[::2])
print(num[3::2])
输出结果:
[1, 3, 5, 7]
[1, 3, 5, 7]
[4, 6, 8]
步长不能为0,但可以是负数,如果步长为0,则会抛出异常,如果步长是负数,则会熊右侧开始分片,这时候开始索引要大于结束索引。
num=[1,2,3,4,5,6,7,8,9]
print(num[8:2:-2])#步长为-2,从索引为8的元素开始,一直索引到位3的元素,运行结果:[9,7,5]
print(num[8:2:-1])#步长为-1,运行结果为:[9,8,7,6,5,4]
print(num[1:6:0])#步长为0,抛出异常
在上面的代码中,如果步长为负数,那么开始索引需要大于结束索引,例如num[8:2:-2],表示从索引为8的元素开始,往前扫描,直到索引为2的元素的上一个元素,也就是索引为3的元素为止。
当然,如果使用负数作为步长,还有一些比较复杂的用法,得出这些用法的分片结果。
3、用负数作为分片步长
num=[1,2,3,4,5,6,7,8,9]
print(num[::-3])
print(num[:3:-2])
输出结果:
1、步长为-3,从序列最后一个元素开始,一直到序列第一个元素结束
[9, 6, 3]
2、步长为-2,从序列的最后一个元素开始,一直到索引为4的元素结束
[9, 7, 5]
例5、要求从Python控制台输入一个url和一个数字n,然后对url分片,获取url的Scheme和Host,最后根据这个数字生成一个包含1到n的序列,然后对序列进行两次分片,一次获取序列中的所有奇数,一次获取序列中的所有偶数,并分成两行错位显示。
url=input('请输入一个https网址:')
scheme=url[0:5]
host=url[8:]
print('scheme:',scheme)
print('host',host)
'''
输出结果:
请输入一个https网址:https://geekori.com
scheme: https
host geekori.com
'''
str=input('请输入一个整数:')
n=int(str)
num=range(1,n)
num1=num[0::2]
num2=num[1::2]
for i in num1:
print(i," ",end='')
print(' ')
print(' ',end='')
for i in num2:
print(i," ",end='')
'''
输出结果:
请输入一个整数:21
1 3 5 7 9 11 13 15 17 19
2 4 6 8 10 12 14 16 18 20
'''
总结
主要介绍分片与索引,分片的几种方式,开始索引与结束索引、负索引、省略索引等