当前位置: 首页 > ds >正文

effective python 条款11 学会对序列做切片

列表切片是Python中最强大且常用的特性之一,它能让你优雅地处理序列数据。本文将带你全面掌握列表切片的各项技巧,助你写出更Pythonic的代码。

切片基础语法

Python切片的基本形式是list[start:end],包含start索引的元素,但不包含end索引的元素:

fruits = ['apple', 'banana', 'cherry', 'date', 'elderberry']
print(fruits[1:3])  # 输出: ['banana', 'cherry']

省略索引的简写

  • 从头开始切片可省略start:
print(fruits[:3])  # 前三个元素
  • 切片到末尾可省略end:
print(fruits[2:])  # 从第三个到末尾
  • 复制整个列表:
fruits_copy = fruits[:]

负数索引的妙用

负数索引表示从列表末尾开始计数:

print(fruits[-2:])    # 最后两个元素
print(fruits[:-1])    # 除最后一个外的所有元素
print(fruits[-3:-1])  # 倒数第三到倒数第二个

安全切片特性

切片的一个强大特性是自动处理边界情况,即使索引超出范围也不会报错:

numbers = [1, 2, 3, 4, 5]
print(numbers[:100])  # 安全返回整个列表
print(numbers[-100:]) # 同样安全

这与直接索引访问形成对比:

# numbers[100]  # 这会引发IndexError

切片赋值的高级技巧

切片不仅可以取值,还可以用于赋值,且支持长度不匹配的替换:

# 替换中间三个元素
numbers[1:4] = [20, 30]
print(numbers)  # [1, 20, 30, 5]# 插入更多元素
numbers[1:1] = [10, 15]  # 在索引1处插入
print(numbers)  # [1, 10, 15, 20, 30, 5]# 清空列表但保留引用
numbers[:] = []

切片与对象身份

理解切片创建的是新对象很重要:

a = [1, 2, 3]
b = a[:]  # 创建新列表
c = a     # 只是引用同一个列表a[0] = 99
print(b)  # [1, 2, 3] 不受影响
print(c)  # [99, 2, 3] 跟着改变

实用技巧集合

  1. 快速反转列表:
reversed_list = original[::-1]
  1. 获取偶数/奇数索引元素:
evens = numbers[::2]   # 第1,3,5...个元素
odds = numbers[1::2]   # 第2,4,6...个元素
  1. 批量替换元素:
data = ['a', 'b', 'c', 'd', 'e']
data[1:4] = ['x', 'y', 'z']
  1. 删除片段:
data[1:4] = []  # 删除索引1-3的元素

性能注意事项

  • 切片操作是O(k)时间复杂度,k是切片长度
  • 大切片会消耗内存,考虑使用itertools.islice处理大数据
  • 频繁切片可考虑使用NumPy数组获得更好性能

总结

掌握Python切片技巧可以让你:

  1. 写出更简洁、可读性更强的代码
  2. 优雅地处理各种序列操作
  3. 避免不必要的循环和临时变量
  4. 提高代码执行效率

切片是Python序列处理的瑞士军刀,熟练运用将极大提升你的编码能力。现在就去你的代码中实践这些技巧吧!

http://www.xdnf.cn/news/15813.html

相关文章:

  • Onload 用户指南 (UG1586)-笔记
  • 【机器学习】安装Jupyter及基本操作
  • 内存泄漏系列专题分析之二十九:高通相机CamX--Android通用GPU内存分配和释放原理
  • 虚拟商品自动化实践:闲鱼订单防漏发与模板化管理的技术解析
  • JVM常用运行时参数说明
  • 【C# in .NET】17. 探秘类成员-构造函数与析构函数:对象生命周期管理
  • [3-02-01].第01章:框架概述 - Spring生态
  • 基于Spring Boot的农村农产品销售系统设计与实现
  • 【Python】DRF核心组件详解:Mixin与Generic视图
  • ARINC818航空总线机载视频处理系统设计
  • 第二篇 html5和css3开发基础与应用
  • 28、鸿蒙Harmony Next开发:不依赖UI组件的全局气泡提示 (openPopup)和不依赖UI组件的全局菜单 (openMenu)、Toast
  • 数据结构入门:像整理收纳一样简单!
  • Jmeter系列(6)-测试计划
  • 李超线段树模板
  • Vue3 中使用 Element Plus 实现自定义按钮的 ElNotification 提示框
  • 「源力觉醒 创作者计划」_巅峰对话:文心 4.5 vs. DeepSeek / Qwen 3.0 深度解析(实战优化版)
  • Matlab打开慢、加载慢的解决办法
  • 构建直播平台大体的流程
  • 后端参数校验
  • Docker部署前后端分离项目——多项目共享环境部署
  • AI进入自动驾驶时代:OpenAI发布革命性ChatGPT Agent
  • 关于在VScode中使用git的一些步骤常用命令及其常见问题:
  • 从 C# 到 Python:6 天极速入门(第二天)
  • 【PTA数据结构 | C语言版】二叉堆的快速建堆操作
  • 数据结构:顺序表和链表
  • LeetCode1047删除字符串中的所有相邻重复项
  • Jenkins+Docker+Git实现自动化CI/CD
  • 谈进程间通信
  • Python 模块化编程全解析:模块、包与第三方库管理指南