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

Pythonitertools高级模式

Python itertools 高级模式
===============================

itertools 提供高效的迭代器工具, 所有函数均返回迭代器——惰性求值, 内存友好.

1. 无限迭代器: cycle / islice / tee
-------------------------------------

from itertools import cycle, islice, tee

# cycle 无限循环可迭代对象
counter = 0
for item in cycle(["红", "黄", "绿"]):
print("循环信号灯:", item)
counter += 1
if counter >= 5:
break

# islice 对迭代器做切片 (惰性)
# islice(iterable, start, stop, step)
data = range(100)
subset = islice(data, 10, 30, 2) # 索引10到30, 步长2
print("islice 切片结果:", list(subset))

# tee 将一个迭代器克隆为 N 个独立副本
src = range(5)
a, b, c = tee(src, 3) # 克隆出3个独立迭代器
print("tee 迭代器a:", list(a)) # [0,1,2,3,4]
print("tee 迭代器b:", list(b)) # [0,1,2,3,4]
print("tee 迭代器c:", list(c)) # [0,1,2,3,4]
# 注意: tee 会缓存数据, 如果原始迭代器很大且多个副本进度差异大, 会消耗内存

2. 组合数学: combinations / permutations / product
-----------------------------------------------------

from itertools import combinations, permutations, product

# combinations: 无放回组合, 元素不重复, 顺序无关
items = ["A", "B", "C"]
print("组合(2个):", list(combinations(items, 2)))
# [('A','B'), ('A','C'), ('B','C')]

# permutations: 排列, 顺序有关, 元素不重复
print("排列(2个):", list(permutations(items, 2)))
# [('A','B'), ('A','C'), ('B','A'), ('B','C'), ('C','A'), ('C','B')]

# product: 笛卡尔积, 相当于嵌套循环, repeat 参数允许重复
print("笛卡尔积:", list(product([0, 1], repeat=2)))
# [(0,0), (0,1), (1,0), (1,1)]

# 实战: 枚举所有可能的密码组合
digits = "0123456789"
# product(digits, repeat=4) 生成所有4位数字密码
for pin in islice(product(digits, repeat=4), 3):
print("密码组合:", "".join(pin))

3. groupby — 分组聚合
-----------------------
groupby 要求输入已排序, 只对连续相同键分组.

from itertools import groupby

data = [("北京", 100), ("北京", 200), ("上海", 150), ("上海", 300), ("广州", 80)]
# 按城市分组前必须先排序
sorted_data = sorted(data, key=lambda x: x[0])

result = {}
for city, group in groupby(sorted_data, key=lambda x: x[0]):
values = [item[1] for item in group]
result[city] = {"总量": sum(values), "次数": len(values), "平均": sum(values)/len(values)}
print("groupby 分组统计:", result)

# groupby 返回的 group 是迭代器, 需要遍历前消费

4. accumulate — 累计运算
--------------------------

from itertools import accumulate
import operator

nums = [1, 2, 3, 4, 5]

# 默认累加
print("累计求和:", list(accumulate(nums))) # [1, 3, 6, 10, 15]

# 累计乘积
print("累计乘积:", list(accumulate(nums, operator.mul))) # [1, 2, 6, 24, 120]

# 自定义函数: 累计最大值
print("累计最大值:", list(accumulate(nums, max))) # [1, 2, 3, 4, 5]

# 斐波那契数列
def fib():
yield 0
yield 1
yield from accumulate(range(2, 20), lambda a, b: a + b)
# 注意: accumulate 的 func 接收 (上一次结果, 当前元素)

5. chain / chain.from_iterable — 展平
-----------------------------------------

from itertools import chain

# chain 连接多个可迭代对象
lists = [[1, 2], [3, 4], [5]]
flattened = chain.from_iterable(lists) # 等价于 chain(*lists)
print("展平列表:", list(flattened)) # [1, 2, 3, 4, 5]

# chain 可混合不同类型
mixed = chain("ABC", [1, 2], (3,))
print("混合类型连接:", list(mixed)) # ['A','B','C',1,2,3]

6. zip_longest — 最长拉链
--------------------------

from itertools import zip_longest

names = ["Alice", "Bob", "Charlie"]
scores = [85, 92]
# 默认 zip 会在最短处截断, zip_longest 用 fillvalue 填充
zipped = zip_longest(names, scores, fillvalue="缺考")
print("zip_longest 结果:", list(zipped))
# [('Alice', 85), ('Bob', 92), ('Charlie', '缺考')]

7. takewhile / dropwhile — 条件筛选
--------------------------------------

from itertools import takewhile, dropwhile

nums = [2, 4, 6, 7, 8, 9, 10]

# takewhile: 拿取满足条件的元素, 遇到第一个不满足就停止
print("takewhile 偶数:", list(takewhile(lambda x: x % 2 == 0, nums)))
# [2, 4, 6]

# dropwhile: 丢弃满足条件的元素, 遇到第一个不满足就保留后续全部
print("dropwhile 偶数:", list(dropwhile(lambda x: x % 2 == 0, nums)))
# [7, 8, 9, 10]

8. pairwise (Python 3.10+) / batched (Python 3.12+)
------------------------------------------------------

from itertools import pairwise, batched

# pairwise: 返回连续重叠对 (s -> (s0,s1), (s1,s2), ...)
items = [1, 2, 3, 4, 5]
print("pairwise 相邻对:", list(pairwise(items)))
# [(1,2), (2,3), (3,4), (4,5)]
# 应用: 检查序列是否单调递增
print("是否单调递增:", all(a < b for a, b in pairwise(items))) # True

# batched: 将迭代器分成指定大小的块
data_batches = list(batched(range(10), 3))
print("batched 分块:", data_batches)
# [(0,1,2), (3,4,5), (6,7,8), (9,)]

9. 自定义迭代器链式模式
-------------------------

def custom_iterator_chain(data):
"""链式组合多个 itertools 操作"""
from itertools import filterfalse, compress, starmap
# filterfalse: 保留不满足条件的元素
return (
data
# 这里用函数组合展示模式, 实际需顺序调用
)

# 典型流水线模式
def pipeline_example(nums):
"""数据处理流水线: 过滤 -> 变换 -> 分组 -> 聚合"""
# 过滤正数
positives = filter(lambda x: x > 0, nums)
# 映射平方
squares = map(lambda x: x ** 2, positives)
# 按奇偶分组
sorted_squares = sorted(squares, key=lambda x: x % 2)
grouped = groupby(sorted_squares, key=lambda x: x % 2)
result = {}
for is_even, group in grouped:
result["偶数" if is_even == 0 else "奇数"] = list(group)
return result

print("流水线结果:", pipeline_example([-3, -2, 1, 2, 3, 4]))

# compress: 按选择器筛选
data = ["a", "b", "c", "d"]
selectors = [1, 0, 1, 0]
print("compress 筛选:", list(compress(data, selectors))) # ['a', 'c']

# starmap: 用 * 解包参数
pairs = [(2, 3), (4, 5), (6, 7)]
print("starmap 求和:", list(starmap(lambda a, b: a + b, pairs)))
# [5, 9, 13]

总结: itertools 函数组合可构建声明式数据管道, 避免中间列表, 代码更简洁高效.

http://www.zskr.cn/news/1424068.html

相关文章:

  • HFSS新手必看:别再搞混工程变量和设计变量了(附Optimetrics实战技巧)
  • 随机梯度下降:从机器学习算法到对抗信息过载的行动心法
  • Lindy销售自动化方案实施全周期拆解:从0到1部署、7天见效、90天规模化复制
  • 从页、锁、索引、事务理解 MySQL 更新与并发
  • 品牌节庆AI宣传视频制作服务商实力排行一览 - 互联网科技品牌测评
  • 2026年太原艺考生文化课全封闭冲刺选校指南:海豚高补 vs 艺道教育 vs 新力惠中高补部 vs 星干线艺考文化课深度横评 - 中国企业名录优选推荐
  • 头戴式超声波三维定位跟随无人机系统-TDOA头随-V1.0
  • 别再死记硬背了!用Python实战带你搞懂DQN里的经验回放(附代码避坑)
  • STM32F4 HAL库实战:用L298N和TB6612对比驱动直流电机,CubeMX配置有何不同?
  • AnythingLLM
  • Vocal Remover Pro
  • 杰理之使用内部框架推点阵屏需要高亮显示操作【篇】
  • 「hyperMILL」告别CAM系统造成的机床停机,释放生产力制造潜能
  • Claude 4.8来了:代码缺陷漏报率降75%,动态工作流支持数百子智能体并行
  • 弹载GNSS软件接收机基带信号处理关键技术解析【附代码】
  • ParsecVDisplay虚拟显示驱动技术实现与应用指南
  • 别只用来抓包了!Fiddler这些隐藏玩法,让调试效率翻倍
  • iOS微信抢红包助手:告别手动抢红包的智能解决方案
  • 2026年青岛留学中介哪家实力强:团队规模、院校资源与申请成功率横向对比 - 科技焦点
  • Claude战略规划文档究竟在隐藏什么?——前Anthropic核心成员透露的3条未公开约束条件
  • C# WinForms海康摄像头实时预览与全屏播放可运行工程(含SDK封装和JSON配置)
  • Ansys Workbench | 传动轴的大变形分析
  • 带后台管理的旅游小程序源码,含前后端+UI资源+部署说明
  • 抖音内容高效下载解决方案:douyin-downloader技术深度解析与实战指南
  • 基于12AX7与JCM800电路自制电子管吉他前级:从拆管到调音的完整实践
  • 修改poolmanager的密码 - 张永全
  • Claude Opus 4.8 深度解读:编码智能体升级、Token 旋钮与“诚实模型”的应试风险
  • 2026年北京烘焙培训推荐榜单:私房烘焙/创业开店/奶油裱花/新手入门与摆摊甜品口碑机构深度解析 - 品牌企业推荐师(官方)
  • 零基础精通GEO优化:行业发展趋势、核心技术内核与企业落地方案解读+国内GEO优化服务商推荐 - 互联网科技品牌测评
  • HC-SR501 PIR传感器与Arduino实战:从原理到智能安防应用