Python的序列切片

2023-05-16

       Python提供了一种把序列切成小块的操作,称为切片(slice)操作,其本质是访问由序列中的某些元素所构成的子集。Python的序列数据结构都支持切片操作,如列表、元组、字符串等,切片操作可以说是日常应用中最常使用的Python特性之一。
(1)基本写法
sequence[start : end]
sequence:表示序列,可以是列表、字符串、元组等;
start:起始索引;
end:结束索引。

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = a[0:5]
c = a[:]
d = a[5:15]
print('a=', a, 'b=', b, 'c=', c, 'd=', d)

     
     
输出结果:
a= [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b= [1, 2, 3, 4, 5]
c= [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
d= [6, 7, 8, 9, 10]
可以看出:
       1)序列a没有变化,说明切片(slice)操作不改变原序列,而是生成一个新序列;
       2)序列b的结果说明从头切片的话,索引值是从0开始的,另外start所指元素在切片结果内,而end所指元素则不包括在切片结果中,说明切片[start:end]是一个半闭区间
       3)序列c结果说明从头切片的话,start索引值0可以省略,如果取到序列末尾,end也应该省略这样更清爽;
       4)序列d结果说明索引范围不能越过序列本身边界,越过边界自动取边界值(Python3特性,在Python2会报错)。
(2)负值索引
       若要从序列尾部向前算,则可以用负值表示相关偏移量。

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = a[:-1]
c = a[-3:]
print('b=', b, 'c=', c)

      
      
输出结果:
b= [1, 2, 3, 4, 5, 6, 7, 8, 9]
c= [8, 9, 10]
可以看出:
       1)序列b比a少了最后一个元素,说明:-1表示最后一个元素
       2)序列c结果表明:用-n代表倒数第n个元素,并且即使start索引是负数,切片顺序也是从前往后的
(3)反向和步进操作
       除了基本写法外,Python还提供了sequence[start : end : stride]的写法,以实现步进式切割。看示例:

s = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a = s[::2]
b = s[::-1]
c = s[::-2]
print('a=', a, 'b=', b, 'c=', c)

      
      
输出结果:
a= [1, 3, 5, 7, 9]
b= [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
c= [10, 8, 6, 4, 2]
      可以看出:
       1)序列a为序列s每隔2个元素进行取值,说明有stride的话按步进值间隔取序列中的元素;
       2)序列b与序列s为反向,说明步进值为负值的话,实施的是反向操作,从序列末尾从后往前取元素。
       3)序列c的结果说明使用负数布进值,除了按照反向操作外,也按照数字大小间隔取元素。
一般的应用情况下,与正向切片相比,反向切片和步进操作使用相对较少,但需要用的话,是非常好用且异常简洁的。看一个反向操作的经典应用:回文字符串判断 回文字符串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。
先看C语言的经典实现:

bool fun(char str[])
{
int i, j, n;
n = strlen(str);
for (i = 0, j = n-1; i <= (n-1)/2; i++, j--)
{
if (str[i] != str[j])
break;
}
if i > j
return True;
else
return False;
}
再看Python中利用反向切片操作的实现,异常简洁:

def fun(str):
return str == str[::-1]
(4)不要同时指定start,end和stride
       按照《Effective Python》一书中的说法,切片操作既有start和end,又有stride的话,可能会令人费解,牺牲了可读性,尤其是有负值索引和负的步进值情况下。看示例:

s = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a = s[-2:2:-2]
print(a)

       
       
输出结果:
a= [9, 7, 5]
       上例意思是从序列s倒着数第二个元素(包含)到序列s正着数第二个元素(不包含)之间的范围(注意切片操作范围是半闭区间)按步进值2进行反向切片,确实有点绕口,但也还算好懂。
       改进方式可以考虑使用两条赋值语句代替,具体方法可是先做范围切片,再做步进切片,也可以先做步进切片,再做范围切片。个人认为先范围再步进的方法更好。

s = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a = s[-2:2:-2]
b = s[3:len(s)-1]
c = b[::-2]
print('a=', a, 'c=', c)

      
      
输出结果:
a= [9, 7, 5]
c= [9, 7, 5]
       上例中b和c先对s做范围切割,再做步进切割。
       实际工作中如果思路清晰,切片使用熟练,同指定start,end和stride无不妥,毕竟就3个参数而已。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python的序列切片 的相关文章

随机推荐

  • 【软件】使用docker尝试解决CUDA的版本与显卡不匹配

    1 CUDA的版本与显卡不匹配 参考 xff1a knavMVSNet代码复现问题解决 cuBlas call failed status 61 13问题 KyrieLiu52的博客 CSDN博客 解决方案 xff1a 1 xff09 更换
  • STM32 HAL库函数学习 I2C篇

    本篇内容讲述STM32的硬件IIC功能 硬件IIC的使用在F1系列上可能会有问题 本次使用的测试平台是H7 xff0c 用于AT24C02芯片的读写正常 xff0c 暂不清楚在其他芯片上使用是否正常 1 HAL StatusTypeDef
  • C++ 第二章 类和对象

    C 43 43 第二章 类和对象 类 c 43 43 新增了对象这个功能 xff0c 不仅有数据 xff0c 而且可以对数据进行操作的函数 Class span class token class name A span span clas
  • Apache站点中文乱码解决方案

    1 编辑apache配置文件修改以下内容 vim etc httpd conf httpd conf 查找AddDefaultCharset字段 将UTF 8修改为GBK或者GB2312重启httpd服务后 xff0c 中文显示正常 2 将
  • bat中调用vs

    https blog csdn net lixiangminghate article details 51350846
  • less文件中导入另一个less文件

    有一个common less文件 根据媒体查询 span class token punctuation span 设置不同屏幕中的html字号 屏幕划分为15等份 默认显示html字号参考750px的宽度 span class token
  • 在Nidia Xavier上使用docker遇到的问题

    在Nidia Xavier上使用docker遇到的问题 1 Xavier没有wifi模块2 在docker run gpus all时出现docker Error response from daemon OCI runtime creat
  • 【解决Anaconda3安装问题】conda --version 不是内部命令、没有script文件

    问题发现 xff1a 当我按照网上的教程安装完的时候 xff0c 到conda version出现下面错误 于是我寻求百度的帮助 xff0c 发现是环境变量的问题 但是我有点疑惑 xff0c 我按照的时候选择自动配置环境变量的 xff0c
  • 自动化测试框架有哪几种?全网最全面的总结来了

    目录 前言 什么是测试自动化框架 自动化测试框架的类型 测试自动化框架的好处 流行测试自动化框架 Robot Framework WebdriverIO Citrus Cypress Selenium Cucumber Gauge Cari
  • haproxy 基本维护命令和监控统计命令

    1服务管理命令 使用rpm包安装 xff0c 服务器管理脚本安装在 etc rc d init d haproxy xff0c 用法如下 haproxy start stop restart reload condrestart statu
  • Docker:docker操作image及container

    操作容器container 列出所有容器 docker span class token function ps span a 删除单个容器 docker span class token function rm span caec5440
  • LinuxMint新手教程3:fcitx输入法的安装与配置

    大概新手人都曾纠结过LinuxMint下的输入法配置问题 其实这个问题也挺容易的 下面我就以安装ppa源中的sogou输入法为例来为大家讲解 xff1a 安装搜狗输入法大概用如下命令就能解决了 xff1a sudo add apt repo
  • ping 原理与ICMP协议及Ping命令的过程与返回信息分析

    一 ping 原理与ICMP协议 ping 的原理 ping 程序是用来探测主机到主机之间是否可通信 xff0c 如果不能ping到某台主机 xff0c 表明不能和这台主机建立连接 ping 使用的是ICMP协议 xff0c 它发送icmp
  • [C++11] 循环引用

    前言 虽然C 43 43 11中的智能指针 xff0c 一定程度上简化了C 43 43 当中的内存管理 xff1b 但是 xff0c shared ptr lt gt 的使用同时也引出了另一个问题 xff1a 循环引用 例子 让我们先来看一
  • MyBatis Plus快速入门

    MyBatis Plus 国产的开源框架 xff0c 基于 MyBatis 核心功能就是简化 MyBatis 的开发 xff0c 提高效率 MyBatis Plus 快速上手 Spring Boot 2 3 0 43 MyBatis Plu
  • jpeg库的移植步骤(GEC6818)

    移植jpeg库 1 将jpegsrc v9a tar gz 解压到共享目录 tar zxvf jpegsrc v9a tar gz C x c z j 压缩GZ xff1a cz 解压bz2格式 xff1a xj C xff1a 指定包解压
  • NSFileManager文件和文件夹的操作

    NSFileManager的文件操作 上面中简单的介绍了数据存储 但是在获取数据 要存储时 一般需要创建一个单独的文件或者文件夹报保存你要存储的数据 所以要介绍一下NSFileManager 这个很重要 在日常开发中会经常使用到这个类 NS
  • 数组排序(C 语言实现)

    本文主要包含常见的数组排序方法 选择排序 原理 在原始数组中取未排序的首元素 xff0c 与其后方所有元素比较 xff0c 不满足顺序 xff0c 则交换首元素此时满足条件 xff0c 未排序部分后移重复上述操作 代码实现 include
  • qt 配置open3d

    一 配置前要先编程open3d 二 开始配置 新建txt 把txt 修改为 pri 在pro 文件中添加 include F xuwanlu control pri 重新构建项目然后回多出来pri 在pri中添加open3d目录 INCLU
  • Python的序列切片

    Python提供了一种把序列切成小块的操作 xff0c 称为切片 xff08 slice xff09 操作 xff0c 其本质是访问由序列中的某些元素所构成的子集 Python的序列数据结构都支持切片操作 xff0c 如列表 元组 字符串等