Practical Python教程:深入理解Python序列操作
序列数据类型概述
Python中有三种主要的序列数据类型,它们都是有序的、可通过整数索引访问,并且具有长度属性:
- 字符串(String):由字符组成的序列,如
'Hello'
- 列表(List):可变元素序列,如
[1, 4, 5]
- 元组(Tuple):不可变元素序列,如
('GOOG', 100, 490.1)
# 序列基础操作示例
greeting = 'Hello' # 字符串
numbers = [1, 4, 5] # 列表
stock_info = ('GOOG', 100, 490.1) # 元组
# 索引访问
print(greeting[0]) # 输出 'H'
print(numbers[-1]) # 输出 5
print(stock_info[1]) # 输出 100
# 获取长度
print(len(greeting)) # 输出 5
序列操作技巧
序列复制与连接
序列支持乘法操作实现复制,以及加法操作实现同类型序列的连接:
# 序列复制
msg = 'Hi'
print(msg * 3) # 输出 'HiHiHi'
nums = [1, 2]
print(nums * 2) # 输出 [1, 2, 1, 2]
# 序列连接
a = (1, 2)
b = (3, 4)
print(a + b) # 输出 (1, 2, 3, 4)
注意:不同类型序列不能直接连接,会引发TypeError。
切片操作详解
切片是获取子序列的强大工具,语法为 s[start:end]
,包含start索引,不包含end索引:
data = [0,1,2,3,4,5,6,7,8]
print(data[2:5]) # 输出 [2,3,4]
print(data[-5:]) # 输出 [4,5,6,7,8] (最后5个元素)
print(data[:3]) # 输出 [0,1,2] (前3个元素)
切片特性:
- 省略start默认为0,省略end默认为序列长度
- 支持负索引,从末尾开始计数
- 切片结果包含start索引元素,不包含end索引元素
切片重新赋值
列表切片支持重新赋值和删除操作:
# 切片重新赋值
nums = [0,1,2,3,4,5]
nums[1:3] = [10,11,12] # 替换切片并可以改变长度
print(nums) # 输出 [0,10,11,12,3,4,5]
# 切片删除
del nums[2:4]
print(nums) # 输出 [0,10,3,4,5]
序列迭代与控制流
基本迭代与循环控制
# 基本迭代
values = [1, 4, 9, 16]
for val in values:
print(val)
# break中断循环
for name in names:
if name == 'Target':
break
print(name)
# continue跳过当前迭代
for line in content:
if not line.strip(): # 跳过空行
continue
process(line)
数值范围迭代
range()
函数生成数值序列,常用于计数循环:
# 基本range用法
for i in range(5): # 0到4
print(i, end=' ') # 输出 0 1 2 3 4
# 指定起始和步长
for i in range(10,0,-1): # 10到1,步长-1
print(i, end=' ') # 输出 10 9 8 ... 1
for i in range(0,10,2): # 0到8,步长2
print(i, end=' ') # 输出 0 2 4 6 8
实用序列工具函数
enumerate() 获取索引和值
names = ['Alice', 'Bob', 'Charlie']
for index, name in enumerate(names, start=1):
print(f"{index}. {name}")
# 输出:
# 1. Alice
# 2. Bob
# 3. Charlie
zip() 并行迭代多个序列
headers = ['name', 'shares', 'price']
values = ['AAPL', 100, 542.3]
# 创建键值对
record = dict(zip(headers, values))
print(record)
# 输出: {'name': 'AAPL', 'shares': 100, 'price': 542.3}
# 多序列并行迭代
a = [1, 2, 3]
b = ['a', 'b', 'c']
for num, char in zip(a, b):
print(num, char)
实际应用案例
处理CSV数据
# 使用zip处理CSV头部和数据行
import csv
def process_portfolio(filename):
with open(filename) as f:
rows = csv.reader(f)
headers = next(rows) # 读取标题行
for rowno, row in enumerate(rows, 1):
try:
record = dict(zip(headers, row))
# 处理记录...
except ValueError as e:
print(f"Row {rowno}: Bad data - {row}")
字典键值反转
prices = {'GOOG': 490.1, 'AAPL': 123.5}
# 反转键值对
inverted = list(zip(prices.values(), prices.keys()))
print(min(inverted)) # 输出 (123.5, 'AAPL')
print(max(inverted)) # 输出 (490.1, 'GOOG')
最佳实践建议
-
避免C风格索引循环:不要使用
for i in range(len(data))
,直接迭代序列元素或使用enumerate
-
利用序列解包:在迭代元组列表时,可以直接解包到多个变量
-
zip处理不等长序列:注意zip会在最短序列结束时停止
-
序列操作选择:
- 需要修改数据:使用列表
- 数据不变:使用元组
- 文本处理:使用字符串
通过掌握这些序列操作技巧,可以编写出更简洁、高效的Python代码,特别是在数据处理任务中。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考