1

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

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.dropwhile 过滤一些结果以使其更小,然后再将其转换为列表,并且得到相同的结果。

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)
4

1 回答 1

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变成一个列表,但如果您所做的只是遍历该列表并逐个处理项目,那么您不应该这样做。仅当您需要随机访问元素时才将其转换为列表。

于 2013-08-22T20:37:13.490 回答