3.3序列通用操作

137 阅读3分钟

Python序列操作终极指南:解锁数据处理的核心技能

序列操作示意图

# 快速导航
sequence_types = ["列表", "元组", "字符串", "字节序列"]

一、核心操作三位一体

1. 索引与切片体系

# 通用索引规则
data = ["A", "B", "C", "D", "E"]
print(data[2])     # 正向索引 → C
print(data[-3])    # 反向索引 → C

# 高级切片技巧
text = "Python"
print(text[1:4])       # 基础切片 → yth
print(text[::2])       # 步长切片 → Pto
print(text[::-1])      # 反转序列 → nohtyP

# 多维切片应用
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
print(matrix[1:3][0][1:])  # 获取[5,6]和[8,9] → [5,6]

切片参数解析表

参数说明示例结果
start起始位置(包含)[2:]从索引2开始
end结束位置(不包含)[:4]到索引3结束
step步长(可负)[::-2]反向步进

2. 迭代的统一法则

# 通用迭代协议
for char in "Hello":  # 字符串迭代
    print(char, end=" ")  # H e l l o

# 反向迭代技巧
numbers = (10, 20, 30, 40)
for num in reversed(numbers):
    print(num)  # 40 30 20 10

# 自定义可迭代对象
class CountDown:
    def __init__(self, start):
        self.start = start
      
    def __iter__(self):
        return (x for x in range(self.start, -1, -1))

for num in CountDown(5):
    print(num)  # 5 4 3 2 1 0

二、内置函数威力全开

1. 基础函数应用

# 长度检测
mixed = [True, None, 3.14, "text"]
print(len(mixed))  # 4

# 极值运算
temperatures = [-5, 12, 8, 21, -3]
print(max(temperatures))  # 21
print(min(temperatures))   # -5

# 空值处理
empty = []
print(sum(empty, start=0))  # 0

2. 进阶统计技巧

# 复合数据类型处理
grades = [
    {"name": "Alice", "score": 88},
    {"name": "Bob", "score": 92},
    {"name": "Charlie", "score": 85}
]

# 获取最高分记录
best = max(grades, key=lambda x: x["score"])
print(f"最高分:{best['name']} {best['score']}分")

# 自定义比较函数
words = ["apple", "banana", "cherry"]
longest = max(words, key=len)  # banana

函数性能对比

操作时间复杂度适用场景
len()O(1)所有序列类型
max/min()O(n)可比较元素的序列
sum()O(n)数值型序列

三、迭代神器深度解析

1. enumerate实战

# 基础用法
colors = ["red", "green", "blue"]
for index, color in enumerate(colors, start=1):
    print(f"第{index}个颜色是{color}")

# 创建字典映射
position_map = {item: idx for idx, item in enumerate("ABCDE", 1)}
# {'A':1, 'B':2, ...}

# 并行修改列表
data = [10, 20, 30]
for i, val in enumerate(data):
    data[i] = val * 2  # [20,40,60]

2. zip魔法应用

# 基础合并
names = ["Alice", "Bob"]
scores = [88, 92]
combined = list(zip(names, scores))  # [('Alice',88), ('Bob',92)]

# 矩阵转置
matrix = [[1,2], [3,4], [5,6]]
transposed = list(zip(*matrix))  # [(1,3,5), (2,4,6)]

# 不等长序列处理
from itertools import zip_longest
nums = [1,2,3]
letters = ['a','b']
print(list(zip_longest(nums, letters, fillvalue='-')))
# [(1,'a'), (2,'b'), (3,'-')]

迭代工具对比表

特性enumeratezip
主要功能添加索引计数器并行迭代多个序列
典型应用场景需要索引的循环合并关联数据
优势避免手动维护索引简化多序列处理

四、性能优化与最佳实践

1. 内存管理技巧

# 切片的内存特性
original = [1,2,3,4]
sliced = original[1:3]  # 创建新列表[2,3]
original[1] = 99
print(sliced)  # 仍为[2,3]

# 生成器表达式优化
big_data = (x**2 for x in range(1000000))  # 内存友好

2. 类型选择策略

# 不同序列类型对比
from sys import getsizeof

data_list = [1,2,3]
data_tuple = (1,2,3)
data_str = "123"

print(f"列表内存:{getsizeof(data_list)}字节")
print(f"元组内存:{getsizeof(data_tuple)}字节")
print(f"字符串内存:{getsizeof(data_str)}字节")

序列类型选择指南

  1. 需要修改 → 列表
  2. 只读数据 → 元组
  3. 文本处理 → 字符串
  4. 二进制数据 → bytes

扩展思考

  • 如何实现自定义序列类型(实现__getitem____len__
  • 切片操作在Pandas DataFrame中的扩展应用
  • 使用itertools模块处理复杂迭代逻辑
  • 生成器表达式与列表推导式的性能差异

下节预告:迭代器协议与生成器原理——掌握Python的惰性计算艺术