【问题标题】:How to use itertools product with a huge data如何使用具有海量数据的 itertools 产品
【发布时间】:2017-05-19 05:52:09
【问题描述】:

我想用python中的1,2,3三个元素来制作一个81元组的列表。

我试图找到一个解决方案,然后我发现了这些有用的链接:

How to use itertools to compute all combinations with repeating elements?

Which itertools generator doesn't skip any combinations?

根据上面的链接,我应该做以下事情

import itertools

list = []
for p in itertools.product(range(1, 3 + 1), repeat=81):
    list.append(p)

print(list)

但是,我的电脑挂了。我认为列表中的数据太多了。

我想知道是否有一个命令只打印列表中的前 100 个元素或列表中的第 101 到 200 个元素。

【问题讨论】:

  • 您正在尝试创建一个包含 443426488243037769948249630619149892803 项的列表。可能你的内存用完了:)

标签: python list product itertools


【解决方案1】:

你可以使用itertools.islice:

p = itertools.product(range(1, 3 + 1), repeat=81)
s = itertools.islice(p, 101, 200)
print(list(s))

然而,这将遍历所有元素,直到它到达切片的起始索引。因此,对于具有大量元素的迭代器末尾的范围(您的有 3**81 = 443426488243037769948249630619149892803 或换句话说:太多而无法处理更不用说存储了),这将遇到类似的问题。

对于后面的范围,您必须手动计算第 n 个元素并从那里生成后继...请参阅 How to select specific item from cartesian product without calculating every other item 以获得一些灵感。

【讨论】:

  • 在我使用它之后,它显示
  • 是的,这就是惰性迭代器的意义所在:您必须(部分地)迭代它或将其转换为列表才能查看元素。因此,您首先对其进行切片(这涉及一些迭代),然后将其转换为列表,然后打印它(如代码示例中所示)。
  • @schowobaseggl 你能在这里看看我的问题吗?你之前已经为类似问题(这篇文章)提供了指导,但我不知道如何在我的脚本上实现它:@987654323 @
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
  • 2018-01-10
  • 2021-07-25
  • 1970-01-01
相关资源
最近更新 更多