一、more‑itertools 库简介
more‑itertools 是对 Python 内置 itertools 模块的扩展与增强库,专注提供更丰富、更易用的迭代器与可迭代对象处理工具,核心原理是基于惰性迭代思想,避免一次性加载全部数据,提升内存使用效率。它补齐了内置迭代工具缺失的常用功能,使用简洁、兼容性强,适合数据处理、流程遍历、算法实现等场景。该库采用 MIT License 开源,无商业使用限制,优点是易用、轻量、性能优秀,缺点是功能与内置库部分重叠,复杂场景需搭配其他工具使用。

二、more‑itertools 安装方法
more‑itertools 是纯 Python 第三方库,不依赖复杂编译环境,使用 pip 即可快速完成安装。
打开命令行终端,执行以下安装命令:
pip install more-itertools若需要指定版本安装,可使用:
pip install more-itertools==10.5.0安装完成后,在 Python 交互环境中执行导入语句,无报错则说明安装成功:
import more_itertools三、more‑itertools 基础功能与代码示例
3.1 chunked:按指定大小分割可迭代对象
在数据分批处理、分页读取、批量写入文件/数据库时,经常需要把长列表、生成器等按固定大小切分,chunked 可以高效完成这一操作,且支持惰性迭代。
代码示例:
from more_itertools import chunked
# 原始列表
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 每3个元素分为一组
result = list(chunked(data, 3))
print("分块结果:", result)运行结果:
分块结果: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]代码说明:chunked 接收可迭代对象与分块大小,返回一个迭代器,每一次迭代输出一个指定长度的子列表,最后不足长度时直接保留剩余元素。
3.2 flatten:扁平化嵌套可迭代对象
处理多层嵌套列表、元组时,手动递归展开容易出错且代码冗余,flatten 可以将任意深度的嵌套结构扁平化为一维迭代器。
代码示例:
from more_itertools import flatten
# 多层嵌套数据
nested_data = [1, [2, [3, 4], 5], 6, [[7]], 8]
# 扁平化处理
flat_result = list(flatten(nested_data))
print("扁平化结果:", flat_result)运行结果:
扁平化结果: [1, 2, 3, 4, 5, 6, 7, 8]代码说明:flatten 会自动识别所有可迭代对象(字符串除外),逐层展开,返回一个不含嵌套结构的迭代器,适用于日志解析、数据清洗、接口返回结构处理等场景。
3.3 unique_everseen:保留迭代对象中首次出现的元素
去重是数据处理高频操作,unique_everseen 可以在迭代过程中只保留第一次出现的元素,且保持原有顺序,比 set 更适合有序去重。
代码示例:
from more_itertools import unique_everseen
# 包含重复元素的列表
repeat_data = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
# 保留首次出现的元素,去重并保持顺序
unique_result = list(unique_everseen(repeat_data))
print("有序去重结果:", unique_result)运行结果:
有序去重结果: [3, 1, 4, 5, 9, 2, 6]代码说明:该函数内部使用集合记录已出现元素,遍历过程中只返回未出现过的元素,适合大数据量流式去重,无需加载全部数据到内存。
3.4 windowed:滑动窗口遍历可迭代对象
时间序列分析、滑动平均、NLP 文本窗口处理等场景常需要滑动窗口功能,windowed 可以生成指定大小的连续滑动窗口。
代码示例:
from more_itertools import windowed
# 原始序列
seq = [1, 2, 3, 4, 5, 6]
# 窗口大小为3
window_result = list(windowed(seq, 3))
print("滑动窗口结果:", window_result)运行结果:
滑动窗口结果: [(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6)]代码说明:windowed 会从序列起始位置开始,每次向后移动一个位置,截取指定长度的窗口,返回元组形式的迭代器,支持设置填充值处理边界。
3.5 first:获取可迭代对象中第一个满足条件的元素
在大量数据中快速查找第一个符合条件的元素时,使用 first 比循环 break 更简洁,且可以设置默认值避免异常。
代码示例:
from more_itertools import first
# 数字列表
num_list = [1, 3, 5, 8, 9, 10]
# 获取第一个偶数
first_even = first(x for x in num_list if x % 2 == 0)
# 无满足条件时返回默认值
default_val = first(x for x in num_list if x > 20), default="未找到"
print("第一个偶数:", first_even)
print("大于20的数:", default_val)运行结果:
第一个偶数: 8
大于20的数: 未找到代码说明:first 接收一个生成器表达式,返回第一个满足条件的元素,若没有匹配项且设置了默认值,则返回默认值,避免 StopIteration 异常。
3.6 last:获取可迭代对象最后一个元素
last 用于快速获取可迭代对象的最后一个元素,支持设置默认值,无需将迭代器转为列表再索引。
代码示例:
from more_itertools import last
# 测试数据
test_data = [10, 20, 30, 40, 50]
# 获取最后一个元素
last_item = last(test_data)
print("最后一个元素:", last_item)运行结果:
最后一个元素: 50代码说明:对于生成器等无法直接索引的对象,last 依然可以正常获取最后一项,比手动遍历更简洁高效。
3.7 partition:按条件将可迭代对象分为两组
partition 可以根据判断条件,将一个可迭代对象分为满足条件与不满足条件两部分,返回两个迭代器,一次遍历完成分类。
代码示例:
from more_itertools import partition
# 数字列表
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
# 按是否大于4分组
is_gt4, no_gt4 = partition(lambda x: x > 4, numbers)
print("大于4的元素:", list(is_gt4))
print("不大于4的元素:", list(no_gt4))运行结果:
大于4的元素: [5, 6, 7, 8]
不大于4的元素: [1, 2, 3, 4]代码说明:partition 只遍历一次数据,内存占用低,适合数据分类、日志筛选、权限判断等场景。
3.8 padded:为迭代对象补充填充值
当迭代对象长度不足时,padded 可以使用指定值填充到目标长度,避免索引越界与长度不匹配问题。
代码示例:
from more_itertools import padded
# 短列表
short_list = [1, 2, 3]
# 填充到长度为6,填充值为0
padded_list = list(padded(short_list, fillvalue=0, n=6))
print("填充后结果:", padded_list)运行结果:
填充后结果: [1, 2, 3, 0, 0, 0]代码说明:该函数常用于模型输入对齐、表格数据补齐、固定长度序列化等场景。
3.9 divide:将可迭代对象均匀分成N份
divide 可以把可迭代对象均匀分成指定份数,适合多进程/多线程任务分片处理。
代码示例:
from more_itertools import divide
# 原始数据
source = list(range(10))
# 均匀分成3份
parts = list(divide(3, source))
print("均匀分份结果:", [list(p) for p in parts])运行结果:
均匀分份结果: [[0, 1, 2, 3], [4, 5, 6], [7, 8, 9]]代码说明:divide 会尽量让每份长度接近,长度无法整除时,前面的分片稍长,适合任务分发、并行计算。
四、more‑itertools 综合实战案例
4.1 学生成绩数据清洗与统计
场景:读取一批带重复、嵌套、缺失的学生成绩数据,完成去重、扁平化、分块、筛选及格成绩等操作。
完整代码:
from more_itertools import (
chunked,
flatten,
unique_everseen,
partition,
windowed
)
# 原始数据:存在重复、嵌套、异常值
raw_scores = [
[85, 92, [78, 65], 88],
[92, 76, 85, [60, 58]],
[78, 90, 92, 85]
]
# 1. 扁平化数据
flat_scores = list(flatten(raw_scores))
print("扁平化后成绩:", flat_scores)
# 2. 去重并保持顺序
unique_scores = list(unique_everseen(flat_scores))
print("去重后成绩:", unique_scores)
# 3. 分为及格(≥60)与不及格(<60)
pass_scores, fail_scores = partition(lambda x: x >= 60, unique_scores)
print("及格成绩:", list(pass_scores))
print("不及格成绩:", list(fail_scores))
# 4. 每3个成绩分块,便于批量处理
score_chunks = list(chunked(unique_scores, 3))
print("成绩分块:", score_chunks)
# 5. 使用滑动窗口计算连续3个成绩的平均值
print("连续3个成绩滑动平均:")
for window in windowed(unique_scores, 3):
if None not in window:
avg = sum(window) / len(window)
print(f"{window} 平均值 = {avg:.2f}")运行结果:
扁平化后成绩: [85, 92, 78, 65, 88, 92, 76, 85, 60, 58, 78, 90, 92, 85]
去重后成绩: [85, 92, 78, 65, 88, 76, 60, 58, 90]
及格成绩: [85, 92, 78, 65, 88, 76, 60, 90]
不及格成绩: [58]
成绩分块: [[85, 92, 78], [65, 88, 76], [60, 58, 90]]
连续3个成绩滑动平均:
(85, 92, 78) 平均值 = 85.00
(92, 78, 65) 平均值 = 78.33
(78, 65, 88) 平均值 = 77.00
(65, 88, 76) 平均值 = 76.33
(88, 76, 60) 平均值 = 74.67
(76, 60, 58) 平均值 = 64.67
(60, 58, 90) 平均值 = 69.33案例说明:本案例完整使用 more‑itertools 多个核心函数,实现从原始脏数据到清洗、分类、分块、统计分析的全流程,代码简洁、可读性高、内存占用低,体现了该库在实际数据处理中的价值。
4.2 日志文本处理实战
场景:读取多行日志内容,去除重复行、按行数分块、提取包含关键词的行。
代码示例:
from more_itertools import chunked, unique_everseen, flatten
# 模拟日志数据
logs = [
"INFO: start service",
"ERROR: connect failed",
"INFO: start service",
"WARNING: low memory",
"ERROR: connect failed",
"INFO: service running"
]
# 去重
unique_logs = list(unique_everseen(logs))
print("去重后日志:")
for log in unique_logs:
print(log)
# 每2条日志分块
log_chunks = list(chunked(unique_logs, 2))
print("\n日志分块存储:", log_chunks)
# 筛选错误日志
error_logs = [log for log in unique_logs if "ERROR" in log]
print("\n错误日志:", error_logs)运行结果:
去重后日志:
INFO: start service
ERROR: connect failed
WARNING: low memory
INFO: service running
日志分块存储: [['INFO: start service', 'ERROR: connect failed'], ['WARNING: low memory', 'INFO: service running']]
错误日志: ['ERROR: connect failed']案例说明:日志处理通常数据量大、存在重复,使用 more‑itertools 可以在惰性迭代的基础上快速完成去重、分块、筛选,大幅简化代码。
五、相关资源
- Pypi地址:https://pypi.org/project/more-itertools
- Github地址:https://github.com/more-itertools/more-itertools
- 官方文档地址:https://more-itertools.readthedocs.io
关注我,每天分享一个实用的Python自动化工具。

