数据切片
2023年8月13日...大约 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.4.2