python - 使用 itertools.tee 复制一个嵌套的迭代器(即 itertools.groupby)
问题描述
我正在读取一个文件(同时执行一些昂贵的逻辑),我需要在不同的函数中迭代几次,所以我真的只想读取和解析文件一次。
解析函数解析文件并返回一个itertools.groupby
对象。
def parse_file():
...
return itertools.groupby(lines, key=keyfunc)
我想过做以下事情:
csv_file_content = read_csv_file()
file_content_1, file_content_2 = itertools.tee(csv_file_content, 2)
foo(file_content_1)
bar(file_content_2)
但是,itertools.tee
似乎只能“复制”外部迭代器,而内部(嵌套)迭代器仍然引用原始迭代器(因此在迭代由 返回的第itertools.tee
一个迭代器后它将被耗尽)。
独立的 MCVE:
from itertools import groupby, tee
li = [{'name': 'a', 'id': 1},
{'name': 'a', 'id': 2},
{'name': 'b', 'id': 3},
{'name': 'b', 'id': 4},
{'name': 'c', 'id': 5},
{'name': 'c', 'id': 6}]
groupby_obj = groupby(li, key=lambda x:x['name'])
tee_obj1, tee_obj2 = tee(groupby_obj, 2)
print(id(tee_obj1))
for group, data in tee_obj1:
print(group)
print(id(data))
for i in data:
print(i)
print('----')
print(id(tee_obj2))
for group, data in tee_obj2:
print(group)
print(id(data))
for i in data:
print(i)
输出
2380054450440
a
2380053623136
{'name': 'a', 'id': 1}
{'name': 'a', 'id': 2}
b
2380030915976
{'name': 'b', 'id': 3}
{'name': 'b', 'id': 4}
c
2380054184344
{'name': 'c', 'id': 5}
{'name': 'c', 'id': 6}
----
2380064387336
a
2380053623136 # same ID as above
b
2380030915976 # same ID as above
c
2380054184344 # same ID as above
我们如何有效地复制嵌套迭代器?
解决方案
似乎grouped_object
( class 'itertools.groupby
') 被消耗一次,即使在itertools.tee
. 同样的并行分配grouped_object
也不起作用:
tee_obj1, tee_obj2 = groupby_obj, groupby_obj
有效的是以下内容的深层副本grouped_object
:
tee_obj1, tee_obj2 = copy.deepcopy(groupby_obj), groupby_obj
推荐阅读
- javascript - 为什么搜索栏会改变标题的位置?
- maven - Gradle init 抛出 NPE
- c# - 如何找到与 Windows 登录相关联的 Microsoft 帐户?
- leaflet - 彩色相交传单圈
- ios - UITableView在插入时重复行
- django - EOF 发生在 python:3.8-slim-buster 上违反协议 (_ssl.c:1125)
- javascript - 使用geojson地图仅在一个轴上调整d3JS中的投影大小
- data-extraction - 如何使用 Visual Basic 从在线网站提取数据并将数据放入文本框或通过附加到 MSSQL 数据库的网格视图?
- scala - 如何在加特林增加计数器?
- python - Kafka 消费者 Python 没有数据 - 消费者一直在听,但没有任何结果