我正在尝试创建列表列表的笛卡尔积。当我尝试将结果转换为列表时,它会给我一个内存错误。如果我在没有将其转换为列表的情况下运行它,它运行正常。
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)
答案 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
转换为列表,但如果您只是循环遍历该列表并逐个处理项目,则不应该这样做。如果您需要随机访问元素,请将其转换为列表。