百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

读一读我——无废话Python(六)使用切片

off999 2024-09-21 21:03 35 浏览 0 评论


切片可以说是 Python 中最重要的特性之一。比如内建的 list,tuple,str 类型全都支持切片操作。而且,切片也是一些著名第三方库的基础,比如 NumPy,Pandas,TensorFlow 和 scikit-learn。因此,要想成为一名合格的 Python 程序员,切片是必会项目。

切片的使用公式如下:

a[start:stop:step]

基础不讲了。这里只总结规律:

  1. 如果 start >= stop 并且 step 是正数,那么将返回值为空。
  2. 如果 stop 大于要截取的序列的长度,返回值为从 start 开始一直到最后一个元素(包含最后一个元素)。
  3. 如果 step 是正数,start 为第一个元素,stop 为最后一个元素,返回值肯定包含第一个元素和最后一个元素。
  4. 如果 step < 0,start 和 stop 都为默认值,返回值肯定包含第一个元素和最后一个元素;如果 stop 不为默认值,返回值肯定不包含 stop 对应的索引。

下面我们来看看如何用切片解决问题。假设有一段文本,给你一个字符串,让你返回一段文本,该文本包含该字符串以及该字符串的前 20 个字符和后 20 个字符。

d = '''
Life is a chess-board The chess-board is the world: the pieces are the phenomena of the universe; the rules of the game are what we call the laws of nature. The player on the other side is hidden from us. We know that his play is always fair, just and patient. But also we know, to our cost, that he c overlooks a mistake, or makes the smallest allowance for ignorance.
'''

find_str = lambda txt, str: txt[txt.find(str)-20:txt.find(str)+20] if str in txt else -1
print(find_str(d, 'smallest')) # stake, or makes the smallest allowance f

查找字符串我们使用的是 in 操作符,查找索引我们用的是 Python 内建的 find 函数,它会返回该字符串首字母索引。根据问题描述,切片的 start 和 stop分别为减 20 和加 20。

当然这段程序有个明显的缺点,就是调用了两次 find 函数,但如果使用临时变量就无法让程序如此简洁了。有没有既简洁又高效的办法?有。你可以先思考一下,我们以后再说。

下面我们来看个列表解析和切片组合使用的例子。

假设我们有一个 4 行 6 列的二维数组,用作机器学习的训练数据。但我们的机器太菜,6 个特征已经不堪重负,需要缩减特征数到 3 个。解决方案如下:

data = [
  [1.1, 1.2, 1.3, 1.4, 1.5, 1.6],
  [2.1, 2.2, 2.3, 2.4, 2.5, 2.6],
  [3.1, 3.2, 3.3, 3.4, 3.5, 3.6],
  [4.1, 4.2, 4.3, 4.4, 4.5, 4.6]
]

result = [line[::2] for line in data]

print(result) # [[1.1, 1.3, 1.5], [2.1, 2.3, 2.5], [3.1, 3.3, 3.5], [4.1, 4.3, 4.5]]

我们的解决方案分两步走。首先利用列表解析从数据中取出每一行数据作为新 list 的元素(还是一个 list,包含 6 个元素);其次,我们利用切片,对这个取出来的含有 6 个元素的 list 做操作,以步长为 2 的方式把 6 个数据缩减到了 3 个数据。

最后,让我们来看看切片的另一个强大特性,slice assignment,中文就叫切片赋值好了。

什么是切片赋值?简单的说就是切片操作放在了等号的左边。

s1[::] = s2[::]

它表达的含义是什么?更简单,就是用 s2 的返回值覆盖 s1 的返回值。来看代码:

# 怪异的数据
data = [
  "a", "1", "b", "2",
  "c", "3", "d", "4",
  "e", "5", "f", "6"
]

# 需求是:把数字替换成它前面的字母
data[1::2] = data[::2]

print(data) # ['a', 'a', 'b', 'b', 'c', 'c', 'd', 'd', 'e', 'e', 'f', 'f']

说实话,在不知道切片赋值之前,我是用循环做的,真的是一名不合格的 Python 程序员。我们来稍稍解释一下。等号左边切片的返回值为:["1", "2", …],等号右边切片的返回值为:["a", "b", …]。

请关注公众号“读一读我”。

相关推荐

Alist 玩家请进:一键部署全新分支 Openlist,看看香不香!

Openlist(其前身是鼎鼎大名的Alist)是一款功能强大的开源文件列表程序。它能像“万能钥匙”一样,解锁并聚合你散落在各处的云盘资源——无论是阿里云盘、百度网盘、GoogleDrive还是...

白嫖SSL证书还自动续签?这个开源工具让我告别手动部署

你还在手动部署SSL证书?你是不是也遇到过这些问题:每3个月续一次Let'sEncrypt证书,忘了就翻车;手动配置Nginx,重启服务,搞一次SSL得花一下午;付费证书太贵,...

Docker Compose:让多容器应用一键起飞

CDockerCompose:让多容器应用一键起飞"曾经我也是一个手动启动容器的少年,直到我的膝盖中了一箭。"——某位忘记--link参数的运维工程师引言:容器化的烦恼与...

申请免费的SSL证书,到期一键续签

大家好,我是小悟。最近帮朋友配置网站HTTPS时发现,还有人对宝塔面板的SSL证书功能还不太熟悉。其实宝塔早就内置了免费的Let'sEncrypt证书申请和一键续签功能,操作简单到连新手都能...

飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx

前面分享了两期TVGate:Q大的转发代理工具TVGate升级了,操作更便捷,增加了新的功能跨平台内网转发神器TVGate部署与使用初体验现在项目已经开源,并支持Docker部署,本文介绍如何通...

Docker Compose 编排实战:一键部署多容器应用!

当项目变得越来越复杂,一个服务已经无法满足需求时,你可能需要同时部署数据库、后端服务、前端网页、缓存组件……这时,如果还一个一个手动dockerrun,简直是灾难这就是DockerCompo...

深度测评:Vue、React 一键部署的神器 PinMe

不知道大家有没有这种崩溃瞬间:领导突然要看项目Demo,客户临时要体验新功能,自己写的小案例想发朋友圈;找运维?排期?还要走工单;自己买服务器?域名、SSL、Nginx、防火墙;本地起服务?断电、关...

超简单!一键启动多容器,解锁 Docker Compose 极速编排秘籍

想要用最简单的方式在本地复刻一套完整的微服务环境?只需一个docker-compose.yml文件,你就能一键拉起N个容器,自动组网、挂载存储、环境隔离,全程无痛!下面这份终极指南,教你如何用...

日志文件转运工具Filebeat笔记_日志转发工具

一、概述与简介Filebeat是一个日志文件转运工具,在服务器上以轻量级代理的形式安装客户端后,Filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并将来自...

K8s 日志高效查看神器,提升运维效率10倍!

通常情况下,在部署了K8S服务之后,为了更好地监控服务的运行情况,都会接入对应的日志系统来进行检测和分析,比如常见的Filebeat+ElasticSearch+Kibana这一套组合...

如何给网站添加 https_如何给网站添加证书

一、简介相信大家都知道https是更加安全的,特别是一些网站,有https的网站更能够让用户信任访问接下来以我的个人网站五岁小孩为例子,带大家一起从0到1配置网站https本次配置的...

10个Linux文件内容查看命令的实用示例

Linux文件内容查看命令30个实用示例详细介绍了10个Linux文件内容查看命令的30个实用示例,涵盖了从基本文本查看、分页浏览到二进制文件分析的各个方面。掌握这些命令帮助您:高效查看各种文本文件内...

第13章 工程化实践_第13章 工程化实践课

13.1ESLint+Prettier代码规范统一代码风格配置//.eslintrc.jsmodule.exports={root:true,env:{node...

龙建股份:工程项目中标_龙建股份有限公司招聘网

404NotFoundnginx/1.6.1【公告简述】2016年9月8日公告,公司于2016年9月6日收到苏丹共和国(简称“北苏丹”)喀土穆州基础设施与运输部公路、桥梁和排水公司出具的中标通知书...

福田汽车:获得政府补助_福田 补贴

404NotFoundnginx/1.6.1【公告简述】2016年9月1日公告,自2016年8月17日至今,公司共收到产业发展补助、支持资金等与收益相关的政府补助4笔,共计5429.08万元(不含...

取消回复欢迎 发表评论: