gpt4 book ai didi

python - 使用 itertools.tee 复制嵌套迭代器(即 itertools.groupby)

转载 作者:太空狗 更新时间:2023-10-30 00:12:32 28 4
gpt4 key购买 nike

我正在读取一个文件(同时执行一些昂贵的逻辑),我需要在不同的函数中迭代多次,所以我真的只想读取和解析文件一次。

解析函数解析文件并返回一个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 返回的第 1st 迭代器。

独立 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

起作用的是深度 copy grouped_object 的:

tee_obj1, tee_obj2 = copy.deepcopy(groupby_obj), groupby_obj

关于python - 使用 itertools.tee 复制嵌套迭代器(即 itertools.groupby),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53994545/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com