说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
itertools.batched() 是 Python 3.12 中引入的一个函数,用于将一个可迭代对象分成大小为 n 的批次。用于将一个可迭代对象拆分成指定大小的批次。每次迭代返回一个固定大小的子序列(batch),直到输入的可迭代对象的元素全部处理完。如果最后一批次的元素不足指定大小,则返回包含剩余元素的子序列。
这是 Python 3.12 新版功能,语法为 itertools.batched(iterable, n)
,来自 iterable 的长度为 n 元组形式的批次数据。 最后一个批次可能短于 n。
itertools.batched(iterable, n)
循环处理输入可迭代对象并将数据积累为长度至多为 n 的元组。 输入将被惰性地消耗,能填满一个批次即可。 结果将在批次填满或输入可迭代对象被耗尽时产生。
如下:
import itertools
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 将数据分成大小为 3 的批次
for batch in itertools.batched(data, 3):
print(batch)
# 输出
'''
(1, 2, 3)
(4, 5, 6)
(7, 8, 9)
'''
再如:
flattened_data = ['roses', 'red', 'violets', 'blue', 'sugar', 'sweet']
unflattened = list(batched(flattened_data, 2))
unflattened
# [('roses', 'red'), ('violets', 'blue'), ('sugar', 'sweet')]
for batch in batched('ABCDEFG', 3):
print(batch)
'''
('A', 'B', 'C')
('D', 'E', 'F')
('G',)
'''
大致相当于:
def batched(iterable, n):
# batched('ABCDEFG', 3) --> ABC DEF G
if n < 1:
raise ValueError('n must be at least one')
it = iter(iterable)
while batch := tuple(islice(it, n)):
yield batch
import itertools
# 将列表分批次,每批次大小为 3
batches = itertools.batched(range(10), 3)
# 输出每个批次
for batch in batches:
print(list(batch))
# 输出:
'''
[0, 1, 2]
[3, 4, 5]
[6, 7, 8]
[9]
'''
import itertools
# 将字符串分批次,每批次大小为 4
batches = itertools.batched("HelloWorld", 4)
# 输出每个批次
for batch in batches:
print(''.join(batch))
# 输出:
'''
Hell
oWor
ld
'''
假设有一个文件,每行包含一个数据项,可以使用 itertools.batched() 将文件中的行按指定大小分批处理:
import itertools
with open('data.txt') as f:
batches = itertools.batched(f, 5)
for batch in batches:
# 处理每个批次的行
print(list(batch))
itertools.batched 是一个非常实用的工具,适用于各种需要将大数据集分块处理的场景。它的简单性和高效性使其成为处理大规模数据的利器。
注意事项:
itertools.batched() 提供了一种简单高效的方法,将一个大的可迭代对象拆分成多个小的批次,方便进行分块处理,特别适合处理大数据和需要批量操作的场景。
import itertools
import sqlite3
# 假设我们有一个 SQLite 数据库连接和游标
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
# 创建一个示例表
cursor.execute('CREATE TABLE IF NOT EXISTS data (id INTEGER PRIMARY KEY, value INTEGER)')
data = list(range(1, 101)) # 示例数据
# 将数据分成大小为 10 的批次进行插入
for batch in itertools.batched(data, 10):
cursor.executemany('INSERT INTO data (value) VALUES (?)', [(value,) for value in batch])
conn.commit()
conn.close()
import itertools
data = list(range(1, 101)) # 示例数据
# 每页显示 10 条数据
page_size = 10
# 分页显示数据
for page_number, batch in enumerate(itertools.batched(data, page_size), start=1):
print(f"Page {page_number}")
for item in batch:
print(item)
print()
# 输出:
'''
Page 1
1
2
3
4
5
6
7
8
9
10
Page 2
11
12
13
14
15
16
17
18
19
20
'''
更新时间:2024-07-03 20:44:04 标签:python itertools 分批