Cartesian产品内存错误将itertools.product转换为列表

时间:2013-08-22 20:34:40

标签: python python-2.7 itertools

我正在尝试创建列表列表的笛卡尔积。当我尝试将结果转换为列表时,它会给我一个内存错误。如果我在没有将其转换为列表的情况下运行它,它运行正常。

lists = [['a','b','c' ],['a','b','c' ],['a','b','c' ],['a','b','c' ],['a','b','c' ],['a','b','c' ],['a','b','c' ],['a','b','c' ],['a','b','c' ]]
my_product = list(itertools.product(*lists))

我甚至尝试使用itertools.drop来过滤一些结果,以便在将其转换为列表之前使其变小,并得到相同的结果。

filtered = itertools.dropwhile(lambda x: x[1]!=x[2] and x[3]!=x[4] and x[3]!=x[5] and x[4]!=x[5], my_product)

1 个答案:

答案 0 :(得分:1)

您正在创建19683个包含9个元素的新元组。您的计算机没有足够的内存可用于所有这些元组。

如果使用list(),则只创建一个生成器对象,当您迭代它时,将逐个生成19683。

您应该过滤itertools.product() 的输出而不将其转换为列表:

my_product = itertools.product(*lists)
filtered = itertools.dropwhile(lambda x: x[1]!=x[2] and x[3]!=x[4] and x[3]!=x[5] and x[4]!=x[5], my_product)

您可以将filtered转换为列表,但如果您只是循环遍历该列表并逐个处理项目,则不应该这样做。如果您需要随机访问元素,请将其转换为列表。