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

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.dtcms.com/a/285813.html

相关文章:

  • 人脸检测算法——SCRFD
  • 智能Agent场景实战指南 Day 16:Agent记忆系统设计
  • 解决 Selenium 页面跳转过快导致的内容获取问题:从原理到实践
  • 基于ROS2进行相机标定,并通过测试相机到棋盘格之间的距离进行验证
  • 大模型格式
  • (一)Eshop(异常处理中间件)
  • 工业数据集成中间件工具OPC Router详细介绍
  • Prompt:开启与AI高效对话的钥匙
  • pycharm windows/linux/mac快捷键
  • Ubuntu18.04开机启动执行脚本
  • 算法-查找算法
  • Git分支管理与Stash技巧:从基础到高级工作流详解
  • C++ - 仿 RabbitMQ 实现消息队列--需求分析与模块设计
  • # Redis-stable 如何在Linux系统上安装和配置
  • 文件流导出文件
  • 小米深圳大厦正式开园,为全球化竞争注入新动能
  • Golang 中 JSON 和 XML 解析与生成的完全指南
  • 一段黄昏小感
  • Linux地址空间
  • 论文分享 | LABRADOR:响应引导的针对物联网设备的黑盒模糊测试
  • 基于ASP.NET+SQL Server的网站登录注册功能设计与实现
  • 软件工程中的《资本论》
  • 文档处理控件TX Text Control系列教程:使用 C# .NET 将二维码添加到 PDF 文档
  • stack and queue 之牛刀小试
  • 【LeetCode 热题 100】199. 二叉树的右视图——(解法一)BFS
  • PDF批量拆分、合并、转图、加密一站式解决方案
  • 文件上传 ,显示文件列
  • 区别下IO多路复用,reactor,事件循环(EventLoop),Epoll这几个的概念以及之间的关系
  • uni-app 跳转外部连接
  • JS获取 CSS 中定义var变量值