详解Python的切片(Slice)

2023-11-08

先看例子:

array = [0, 1, 2, 3, 4, 5]
print(array[:])
print(array[::-1])
print(array[::2])
print(array[:-4:-1])
print(array[-4:5])
print(array[-10:3])

结果是:

[0, 1, 2, 3, 4, 5]
[5, 4, 3, 2, 1, 0]
[0, 2, 4]
[5, 4, 3]
[2, 3, 4]
[0, 1, 2]

这就是 Python 的切片(Slice)操作。

切片的语法是:

m[start:stop:step]

其中:

start,stop,step,:step 均可以省略,省略的 start 和 stop 会被 None 替换,省略的 step 会被 1 替换
m 可以是 list,tuple,str,range,或支持 getitem 等几个方法的自定义类
start 和 stop 可以是 None,整数,或拥有 __index__ 方法的对象(__index__方法须返回一个整数)
step 必须是非零整数
返回一个包含 m 部分元素的副本(浅复制)

结果的获得:

1) 找到 start 和 stop 在 m 中对应的位置
2) step 为正时,如果 start 为 None,可认为 start 为0,如果 stop 为 None,可认为 stop 为 len(m);	step 为负时,如果 start 为 None,可认为 start 为 -1,如果 stop 为 None,可认为 stop 为 -1-len(m)
3) step 为正时,stop 应在 start 的右边,step 为负时,stop 应在start 的左边,否则得到空序列
4) 在 [start,stop) 所标识的区间之内以 step 步进取得相应元素

实际动作相当于(对应后边的简单实现来看):

1) step 为正时,m 的边界为 [0,len(m));step 为负时,m 的边界为 [-1,-1-len(m))
2) 如果 start 或 stop 为 None,根据 step 不同将其替换为 m 的边界,比如 start==None and step>0,将 start 替换为 0
3) 如果 start 或 step 的值超出 m 的索引范围,将其限制为 m 的边界
4) 在 [start,stop) 范围内查找相应元素:step 为正时,从左向右找元素;step 为负时,从右向左找元素

##作为左值进行赋值
array = [0, 1, 2, 3, 4, 5]
array[2:4] = [8,8,8]
print(array)
# [0, 1, 8, 8, 8, 4, 5]
对于list有几点需要说明和注意:

  1. 右侧对象必须是iterable。
  2. step 不为 1 时,= 两侧区间的大小必须相同,新元素将替换旧元素;
    step 为 1 时,即切片标识一段从左向右的连续区间,两侧区间大小可以不同,新区间将替换旧区间。
  3. 切片标识的区间为空时,将在 start 位置之前插入新区间,此规则不与 规则2 冲突:此时如果 step 不是 1,新区间的大小则必须是 0。

例子如下:

array = [0, 1, 2, 3, 4, 5]
array[2:0] = [9.9, 8.8]
print(array)
# [0, 1, 9.9, 8.8, 2, 3, 4, 5]

##自定义类型
自定义类型如想使用下标运算符[],需酌情定义以下几个函数:

__getitem__(self, key)
	m[k]  =>  m.__getitem__(k)

__setitem__(self, key, value)
	m[k]=v  =>  m.__setitem__(k,v)

__delitem__(self,key)
	del m[k]  =>  m.__delitem__(k)

此时[ ]内可接受任何类型参数,[ ]内的切片表达式将自动形成slice实例,比如:

[:]     =>  slice(None,None,None)
[1:3:2] =>  slice(1,3,2)

##附字符串的部分切片实现

# m是原字符串, 返回切片后的字符串副本
def slice_L(m, start, stop, step):
    if step>0:
        # 将start和stop都调整为正数
        if start==None:
            start=0
        if stop==None:
            stop=len(m)
        # 如果start太左, 限制为0
        if start<=-len(m):
            start=0
        elif -len(m)<start<0:
            start+=len(m)
        # 如果stop太右, 限制为len(m)
        if stop>len(m):
            stop=len(m)
        elif -len(m)<stop<0:
            stop+=len(m)
        # start太右或stop太左的情况
        if start>=stop:
            return ''

        s=''
        for i in range(start,stop,step):
            s+=m[i]
        return s

    if step<0:
        if start==None:
            start=-1
        if stop==None:
            stop=-1-len(m)
        if start>=len(m):
            start=-1
        elif 0<=start<len(m):
            start-=len(m)
        if stop<-len(m):
            stop=-1-len(m)
        elif 0<=stop<len(m):
            stop-=len(m)
        if start<=stop:
            return ''
        s=''
        for i in range(start,stop,step):
            s+=m[i]
        return s
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详解Python的切片(Slice) 的相关文章

随机推荐

  • 从ChatGPT看人工智能

    ChatGPT是2022年出来的一个对话型人工智能 ChatGPT就是这样一种可以和人类用自然语言去交流的人工智能 一上线就引发了恐慌 最厉害的地方还是它能够用人类的语言来进行交流 不管是中文 英文 日文都可以 ChatGPT有可能就是传说
  • nuxt项目中引入ant design vue的less文件报错.bezierEasingMixin()

    最近使用nuxt 2 14 0版本当中使用 ant desgin vue 这个UI框架进行定制主题 首先 在nuxt项目当中的assets文件夹当中创建less文件夹 在less文件夹下创建index less和variable less文
  • 怎样在webpack中使用 art-template 模板引擎, art-template详解

    1 简介 art template是一个简约 执行速度超快的模板引擎 它采用作用域声明的技术来优化模板渲染速度 从而获得接近 Javascript 极限的运行性能 并且同时支持 NodeJs和浏览器 使用art template 便于代码的
  • linux cpu 内存爆满 mysql停止_每个程序员都应该知道的 CPU 知识:NUMA

    什么是 NUMA 早期的计算机 内存控制器还没有整合进 CPU 所有的内存访问都需要经过北桥芯片来完成 如下图所示 CPU 通过前端总线 FSB Front Side Bus 连接到北桥芯片 然后北桥芯片连接到内存 内存控制器集成在北桥芯片
  • 基于机器学习的油田产油量产量预测 AdaBoost、xgboost、lightgbm 完整代码数据 可直接运行

    项目讲解 基于机器学习 knn 逻辑回归 决策树 集成学习 adaboost梯度提升树 SVC xgboost的工业产量预测数据分析可视化 哔哩哔哩 bilibili 基于机器学习XGB svm LGBM knn的 from sklearn
  • Profiling Top Kagglers: Bestfitting, Currently #1 in the World

    We have a new 1 on our leaderboard a competitor who surprisingly joined the platform just two years ago Shubin Dai bette
  • 研究下DFD

    数据流图 简称DFD 是SA方法中用于表示系统逻辑模型的一种工具 它以图形的方式描绘数据在系统中流动和处理的过程 由于它只反映系统必须完成的逻辑功能 所以它是一种功能模型 下图是一个飞机机票预订系统的数据流图 它反映的功能是 旅行社把预订机
  • JAVA学习------打印多种星星矩阵

    打印一个10 10的星星矩阵 package step1 public class ForPractice1 public static void test start for int i 1 i lt 10 i for int j 1 j
  • [网络安全提高篇] 一一六.恶意代码同源分析及BinDiff软件基础用法

    网络安全提高班 新的100篇文章即将开启 包括Web渗透 内网渗透 靶场搭建 CVE复现 攻击溯源 实战及CTF总结 它将更加聚焦 更加深入 也是作者的慢慢成长史 换专业确实挺难的 Web渗透也是块硬骨头 但我也试试 看看自己未来四年究竟能
  • warning: remember to run ‘libtool --finish /usr/local/1/php-7.4.29/libs

    ubuntu上php7 4 33编译安装完成后警告报错 如下所示 usr local apache2 apr build 1 libtool finish usr local soft php 7 4 33 libs vim etc ld
  • C++:打印大写字母对应的ASCII码

    题目描述 输出26个大写字母对应的ASCII码 每输出 个ASCII码换一行再输出下一行 输入 输出 输出 个十进制整数 即对应大写字母的ASCII码 输出格式见样例 样例输入 Copy 样例输出 Copy 65 66 67 68 69 7
  • Docker学习进阶篇

    学自狂神 视频地址 https www bilibili com video BV1kv411q7Qc share source copy web 目标 掌握 docker基础 原理 网络 服务 集群 错误排查 日志 linux docke
  • java处理时间字符串2021-08-04T16:00:00.000Z

    背景 业务中收到了字符串2021 08 04T16 00 00 000Z 也有可能是2021 08 05 或者2021 08 05 12 00 00由于不确定性 需要手动转换时间 直接上代码 public static String int
  • 在webpack中使用monaco-editor

    目录 前言 使用 自己总结的使用过程 1 安装 2 在页面中使用 3 开启辅助功能 4 如何设置菜单中文显示效果 5 编辑器功能 6 monaco editor使用到的JS文件如何压缩 2020年4月28日11 49 58 前言 我查过网上
  • ROS中多个工作空间同时工作

    ROS开发中 有时需要建多个工作空间 将不同的功能包区别开来 但是 多个工作空间会存在相互影响的情况 如何让它们能同时工作且相互不影响 需要技巧 这里需要清楚ROS工作空间的工作原理 本文做个详细介绍 1 ROS PACKAGE PATH环
  • 汽配企业如何把MES管理系统的价值利用到最大化

    随着信息技术的快速发展 越来越多的汽配企业开始引入MES生产管理系统 以提高生产效率 优化资源利用和提升产品质量 然而 要想实现MES系统的最大化价值 汽配企业需要从以下几个方面入手 首先 汽配企业应该充分了解MES系统的功能和特点 并根据
  • git笔记

    git笔记 第一次使用配置 git config global user email you example com git config global user name Your Name 生成ssh key ssh keygen t
  • Matplotlib Intermediate Styling with cycler

    Styling with cycler 自定义属性循环设置的演示以控制多个 line 的图的颜色和其他样式属性 这个例子演示了两种不同的 API 设置 rc 参数 指定默认属性循环 这会影响所有随后的 axes 不会影响已经创建的 axes
  • 论文笔记:Learning Transferable Visual Models From Natural Language Supervision(CLIP)

    1 Intro 目前最先进的CV模型 大部分是现有一个定义好的类别的集合 然后模型通过预测这些提前定义好的类别 从而完成模型的训练 这些提前定义好的类别会大大简化问题本身 但采用了这种有限制性的监督信号 也大大限制了模型的泛化性 尤其是识别
  • 详解Python的切片(Slice)

    先看例子 array 0 1 2 3 4 5 print array print array 1 print array 2 print array 4 1 print array 4 5 print array 10 3 结果是 0 1