《Python一行流》学习笔记3——切片(slice)操作

1 切片(slice)介绍

        切片(slice):从完整的原始序列中提取出子序列,以处理简单的文本查询。

        在Python的大量概念和技巧中,切片都是不可或缺的基础,不管是在操作Python内置的数据结构如列表、元组和字符串时,还是在许多高级Python库如Numpy、Pandas、TensorFlow和scikit-learn时。

        其基本语法如下:

x[start:stop:step]

        生成的子序列将从 start 代表的索引(包含)开始,到 stop 代表的索引(不含)结束——左闭右开。step 为可选参数,代表每过 step 个元素抽取一个,默认 step=1。

        如果不写 start——x[:stop],则假定你想要从头开始,一直切到 stop 代表的索引(不含);如果不写 stop——x[start:],则假定你想要从 start 开始,一直切到最后一个元素。

s = 'Eat more fruits!'

print(s[1:3])
# at

print(s[3:1])
# ''——空字符
# start >= stop, 且 step 为正值(默认为1),则切片会为空

print(s[:5])
# Eat m

print(s[5:])
# ore fruits!

print(s[:100])
# Eat more fruits!
# stop 比原序列还长,则会把切片一直切到最右边的元素

print(s[4:8:2])
# mr

print(s[::3])
# E rfi!
# step > 0, 默认 start 值会是最左边的元素(包含),stop 为最右边的元素(不含)

print(s[::-1])
# !stiurf erom taE
# step < 0,切片会以逆序遍历,stop 值会是最左边的元素(不含),start 为最右边的元素(含)

print(s[6:1:-1])
# rom t

2 项目1:找到特定的搜索关键词

        在一个多行字符串中找到一个特定的搜索关键词,需要找到关键词在文本中的位置,并返回它所处的上下文环境,即前后各18各字符。搜索时一并提取上下文很有用,能让你看到搜索结果处于什么文本环境之中。

# 数据
txt = '''
I have a dream that one day every valley shall be exalted, 
and every hill and mountain shall be made low, the rough 
places will be made plain, and the crooked places will be 
made straight; "and the glory of the Lord shall be revealed 
and all flesh shall see it together
'''

# 一行流
find = lambda x, q: x[x.find(q)-18:x.find(q)+18] if q in x else -1
# 1、定义了一个 lambda 函数,其有两个参数:一个文本字符串 x,一个要在文本中
#   搜索的关键词q。
# 2、如果 q 不在 x 中,就返回 -1;否则返回 q 在 x 中的第一次出现的位置,
#   即 q[0] 在 x 中的索引,并加上前后各18各字符。

# 结果
print(find(txt, 'mountain'))
# nd every hill and mountain shall be 

3 列表解析和切片

        使用列表解析+切片,可以使得我们从大得令人望而却步的样本集中提取一个较小但有代表性的数据样本——列表解析让你可以遍历列表并加以修改;切片让你可以快速地从一个给定列表中选出间隔的元素,而且它自认地适用于简单的过滤操作。

        给定一个列表数据,其中每个元素都是由6个浮点数据组成的子列表,现在的目标是从这份数据中创建一个新的训练数据集。

# 数据
price = [[9.9, 9.8, 9.8, 9.4, 9.5, 9.7],
         [9.5, 9.4, 9.4, 9.3, 9.2, 9.1],
         [8.4, 7.9, 7.9, 8.1, 8.0, 8.0],
         [7.1, 5.9, 4.8, 4.8, 4.7, 3.9]]

# 一行流
sample = [line[::2] for line in price]
# 该一行流可以分解成两步来看
# 第一步:用列表解析遍历原序列的所有行的元素
# 第二部:对每一行进行切片(step=2),得到一个新列表

# 结果
print(sample)
# [[9.9, 9.8, 9.5], [9.5, 9.4, 9.2], [8.4, 7.9, 8.0], [7.1, 4.8, 4.7]]

4 使用切片赋值修改原序列

         切片赋值:在赋值操作符的左侧使用切片符号,以此对原序列的子序列进行修改,即把左边原序列的选定元素替换成右边的元素。

        该操作常用于用某些数据来局部替换某些损坏的数据。

        给以一个字符串列表,现在要求每个一个字符串,就用紧挨在它前面的字符串将其替换掉。

 数据
strs = ['apple', 'banana', 'cherry', 'orange',
        'cat', 'dog', 'ant', 'duck',
        'basketball', 'baseball', 'volleyball', 'tennis']
'''
print(strs[1::2])
# ['banana', 'orange', 'dog', 'duck', 'baseball', 'tennis']

print(strs[::2])
# ['apple', 'cherry', 'cat', 'ant', 'basketball', 'volleyball']
'''

# 一行流
strs[1::2] = strs[::2]
# 用 strs[::2] 的数据替换 strs[1::2]的数据

# 结果
print(strs)
# ['apple', 'apple', 'cherry', 'cherry',
# 'cat', 'cat', 'ant', 'ant',
# 'basketball', 'basketball', 'volleyball', 'volleyball']

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值