我正在尝试创建列表列表的笛卡尔积。当我尝试将结果转换为列表时,它会给我一个内存错误。如果我运行它而不将其转换为列表,它运行良好。
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)
您正在创建 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
转换为列表,但如果您所做的只是循环该列表并逐项处理项目,则不应该这样做。仅当您需要随机访问元素时才将其转换为列表。
我是一名优秀的程序员,十分优秀!