跳至主要內容

数据切片

PaperDragon...大约 6 分钟

数据切片

字符串切片

s1 = 'Hello World'

print(s1[4])  # 索引从0开始
print(s1[-1])  # 负数从-1开始,代表从后往前

# 切片 类似range
# [start:end:step]
print(s1[0:5])  # Hello
print(s1[:5])  # Hello
print(s1[:])  # Hello World
print(s1[::2])  # HloWrd
print(s1[::-1])  # dlroW olleH

# 求1000以内所有类似 121 212 的数字, 回文数

for i in range(10, 1000):
    if str(i) == str(i)[::-1]:
        print(i)



基本切片

基本语法: a[start : end],使用该语法之后,会获得a列表中左闭右开的一系列元素。当start和end为负数时,当作是负数索引进行切片即可。

正数

start从0开始算

end从1开始算

start 为负数,从 -1 开始算

end 为正数,从1开始算


# coding:utf-8

a = []
for i in range(10):
    a.append(i)

print(a)
# 基本索引
print("第0个元素为", a[0])
# 使用负数索引
print("第-2个元素为", a[-2])
# 索引超出有效索引范围
# print(a[100])
# 基本切片
print(a[2:8])
print(a[-5:-2])
print(a[2:-1])

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
第0个元素为 0
第-2个元素为 8
[2, 3, 4, 5, 6, 7]
[5, 6, 7]
[2, 3, 4, 5, 6, 7, 8]

超出有效范围

使用基本索引的话,超出有效范围,就会报错。 而在切片中,如果超出有效范围是不会报错的。但是会进行截断,就是仍然按范围进行左闭右开的获取,但是超出序列数据范围的部分,全部假想成空值,最终对获取到的空值进行忽略即可。 例如:

# coding:utf-8

a = []
for i in range(10):
    a.append(i)

print(a)
# 基本索引
print("第0个元素为", a[0])
# 使用负数索引
print("第-2个元素为", a[-2])
# 索引超出有效索引范围
# print(a[100])
# 基本切片
print(a[2:8])
print(a[-5:-2])
print(a[2:-1])

# 超出有效范围
print("-" * 50)
print(a[-100:100])
print(a[3:55])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]0个元素为 0-2个元素为 8
[2, 3, 4, 5, 6, 7]
[5, 6, 7]
[2, 3, 4, 5, 6, 7, 8]
--------------------------------------------------
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[3, 4, 5, 6, 7, 8, 9]

start在end的右边

当索引start在end的右边时,会发生什么呢? 不会报错。因为切不出元素,所以会返回一个空序列。

# coding:utf-8

a = []
for i in range(10):
    a.append(i)

print(a)
# 基本索引
print("第0个元素为", a[0])
# 使用负数索引
print("第-2个元素为", a[-2])
# 索引超出有效索引范围
# print(a[100])
# 基本切片
print(a[2:8])
print(a[-5:-2])
print(a[2:-1])

# 超出有效范围
print("-" * 50)
print(a[-100:100])
print(a[3:55])

# 当start在end的右边
print("-" * 50)
print(a[8:2])

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
第0个元素为 0     
第-2个元素为 8    
[2, 3, 4, 5, 6, 7]
[5, 6, 7]
[2, 3, 4, 5, 6, 7, 8]
--------------------------------------------------
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[3, 4, 5, 6, 7, 8, 9]
--------------------------------------------------
[]

start或end为缺省时

start和end是可以为缺省的,当start和end为缺省时,Python是尽可能取最大区间的。 例如:

# coding:utf-8

a = []
for i in range(10):
    a.append(i)

print(a)
# 基本索引
print("第0个元素为", a[0])
# 使用负数索引
print("第-2个元素为", a[-2])
# 索引超出有效索引范围
# print(a[100])
# 基本切片
print(a[2:8])
print(a[-5:-2])
print(a[2:-1])

# 超出有效范围
print("-" * 50)
print(a[-100:100])
print(a[3:55])

# 当start在end的右边
print("-" * 50)
print(a[8:2])

# 缺省
print("-" * 50)
print(a[:5])
print(a[2:])

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
第0个元素为 0
第-2个元素为 8
[2, 3, 4, 5, 6, 7]
[5, 6, 7]
[2, 3, 4, 5, 6, 7, 8]
--------------------------------------------------
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[3, 4, 5, 6, 7, 8, 9]
--------------------------------------------------
[]
--------------------------------------------------
[0, 1, 2, 3, 4]
[2, 3, 4, 5, 6, 7, 8, 9]

可以调整步长的切片

语法是:a[start : end :step],表示从start开始,每step取一个值,直到跨越了end(不包含end),step可正可负,不为0. 其实咋们平时用的基本切片就是step为1的切片!

step为正

# coding:utf-8

a = []
for i in range(10):
    a.append(i)

print(a)
# 基本索引
print("第0个元素为", a[0])
# 使用负数索引
print("第-2个元素为", a[-2])
# 索引超出有效索引范围
# print(a[100])
# 基本切片
print(a[2:8])
print(a[-5:-2])
print(a[2:-1])

# 超出有效范围
print("-" * 50)
print(a[-100:100])
print(a[3:55])

# 当start在end的右边
print("-" * 50)
print(a[8:2])

# 缺省
print("-" * 50)
print(a[:5])
print(a[2:])

# 带有步长的切片
# 步长为正
print("*" * 50)
print(a[0:7:2])
print(a[::2])
print(a[:-3:2])
print(a[-100:-4:3])

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
第0个元素为 0
第-2个元素为 8
[2, 3, 4, 5, 6, 7]
[5, 6, 7]
[2, 3, 4, 5, 6, 7, 8]
--------------------------------------------------
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[3, 4, 5, 6, 7, 8, 9]
--------------------------------------------------
[]
--------------------------------------------------
[0, 1, 2, 3, 4]
[2, 3, 4, 5, 6, 7, 8, 9]
**************************************************
[0, 2, 4, 6]
[0, 2, 4, 6, 8]
[0, 2, 4, 6]
[0, 3]

step为负

当step为负时,会进行逆序切片。因为当缺省时,python尽可能使获取到的区间尽可能大,那么缺省时,start会趋近无穷大,end会趋近无穷小。

# coding:utf-8

a = []
for i in range(10):
    a.append(i)

print(a)
# 基本索引
print("第0个元素为", a[0])
# 使用负数索引
print("第-2个元素为", a[-2])
# 索引超出有效索引范围
# print(a[100])
# 基本切片
print(a[2:8])
print(a[-5:-2])
print(a[2:-1])

# 超出有效范围
print("-" * 50)
print(a[-100:100])
print(a[3:55])

# 当start在end的右边
print("-" * 50)
print(a[8:2])

# 缺省
print("-" * 50)
print(a[:5])
print(a[2:])

# 带有步长的切片
# 步长为正
print("*" * 50)
print(a[0:7:2])
print(a[::2])
print(a[:-3:2])
print(a[-100:-4:3])


# 步长为负时
print("@" * 50)
print(a[::-1])
# 为了保证取到的区间尽可能大,所以end趋向无穷小,所以会切到索引0
print(a[6::-1])
# 因为逆序切,为了保证取到的区间尽可能大,所以start会趋向于无穷大,一直切到索引4(不包含4)
print(a[:4:-2])

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
第0个元素为 0
第-2个元素为 8
[2, 3, 4, 5, 6, 7]
[5, 6, 7]
[2, 3, 4, 5, 6, 7, 8]
--------------------------------------------------
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[3, 4, 5, 6, 7, 8, 9]
--------------------------------------------------
[]
--------------------------------------------------
[0, 1, 2, 3, 4]
[2, 3, 4, 5, 6, 7, 8, 9]
**************************************************
[0, 2, 4, 6]
[0, 2, 4, 6, 8]
[0, 2, 4, 6]
[0, 3]
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
[6, 5, 4, 3, 2, 1, 0]
[9, 7, 5]

连续的切片

>>> a 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> a[:8][2:5][-1:] ## [:8]就是0取到8,在从其中取2到5,最后取-1位
[4] 
a[:8] ---- [0,1,2,3,4,5,6,7] 
[0,1,2,3,4,5,6,7][2:5]----[2,3,4] 
[2,3,4][-1:] ----[4] 

切片中的三个参数为表达式

>>> a 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> a[1+2:2*3:7%2]  ## 思路一样,运算出来,继续切
[3, 4, 5] 

切片可以操作其他的对象

>>> t = (1,2,3,4,5) 
>>> t[1:3] 
(2, 3) 
>>> s = "ACDRF" ##切片在字母上也是可以使用的,所以说切片很强大
>>> s[1:3] 
'CD' 
>>> (0, 1, 2, 3, 4, 5)[:3]#元组的切片操作
>>> (0, 1, 2)
>>> for i in range(0,100): 
... print(i) 
... 
>>> for i in range(0,100)[2::3][-10:]: ## 意思是从第二位开始取,步长为3,[-10]则是从倒数10位开始取,意思是去末尾10位.
... print(i) 
... 
71
74
77
80
83
86
89
92
95
98

实例

获取文件d

https://api-static.mihoyo.com/common/blackboard/ys_obc/v1/content/info?app_sn=ys_obc&content_id=1360

i['audio'] = 'https://uploadstatic.mihoyo.com/ys-obc/2022/05/12/6276411/038800810c40397c591479e27a4699bf_2558794961247120121.mp3'

i['audio'].split('/')[-1].replace('.mp3', '.wav')




你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3