将Python迭代器拆分为块的语法不正确

时间:2017-03-25 16:56:21

标签: python itertools

我有一些代码采用了元组列表列表的笛卡尔积,然后将生成的迭代器映射并转换回列表以供后续函数使用:

# Take the Cartesian product of a list of lists of tuples
groups = itertools.product(*list_of_lists_of_tuples)

# Mapping and casting to list is necessary to put in the correct format for a subsequent function
groups_list = list(map(list, groups))

这一切在摘要中工作得很好,但在处理大量列表大小时会导致内存错误。看起来itertools.product已经是一个发电机;内存瓶颈似乎是映射和重铸。我以为我可以通过分成块来解决这个问题。现在关于如何将Python迭代器拆分为块的一般问题已在本网站上多次询问,并且似乎有许多好的答案,包括但不限于:

What is the most "pythonic" way to iterate over a list in chunks?

Python generator that groups another iterable into groups of N

Iterate an iterator by chunks (of n) in Python?

...但我认为在我开始理解可迭代和生成器的过程中必定存在一些令人尴尬的缺陷,因为我似乎无法让它们中的任何一个起作用。例如,假设一个石斑鱼函数类似于其他一些线程中的内容:

def grouper(self, it, n):
    iterable = iter(it)
    while True:
        chunks = itertools.islice(iterable, n)
        try:
            first_chunk = next(chunks)
        except StopIteration:
            return
        yield itertools.chain((first_chunk,), chunks)

...我期待结果是我的itertools.product对象的块,然后我可以独立操作:

groups = itertools.product(*list_of_lists_of_tuples)

# create chunks of the iterator that can be operated on separately and then combined back into a list
groups_list = []
for x in self.grouper(groups, 100):
    some_groups_list = list(map(list, x))
    groups_list.extend(some_groups_list)

我得到空列表。有些事情显然是错的,而且 - 再次 - 我认为这里的主要问题是对我的不了解。任何建议都将不胜感激。

0 个答案:

没有答案