1

我有一个返回元组列表的函数,我想遍历它:

def get_parameter_product(num_parameters, lower_range, upper_range):
    param_lists = [ xrange(lower_range, upper_range) for _ in xrange(num_parameters)]   
    return list(itertools.product(*param_lists))

for p in get_parameter_product(3, 0, 5):
    print p,

(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4), ... , (4, 4, 2), (4, 4, 3), (4, 4, 4)

但是,对于较大的 num_parameters 值,需要分配大量内存。是否可以将其转换为生成器?

4

3 回答 3

2

itertools.product已经是生成器了。您可以只返回它而不是将其转换为列表。

于 2012-11-19T23:18:57.910 回答
2

您的方法是添加一个不需要的无关步骤。

prod_list = get_parameter_product(3, 0, 5)

可以替换为

prod_genr = product(range(0, 5), repeat=3)

任何 initertools返回一个生成器而不是listor tuple。您可能希望查看文档以检查您真正想要product的,而不是combinationsor permutations

于 2012-11-19T23:33:33.193 回答
0

您不需要将列表转换为生成器——只是不要将生成器转换为列表。

首先,要构建param_lists,使用生成器表达式而不是列表推导式,您将使用迭代器而不是列表。

其次,不要listreturn声明中调用。

>>> def get_parameter_product(num_parameters, lower_range, upper_range):
...     param_lists = (xrange(lower_range, upper_range) for _ in xrange(num_parameters))
...     return itertools.product(*param_lists)
>>> p = get_parameter_product(3, 0, 5)
>>> print(p)
<generator object <genexpr> at 0x101d650f0>
>>> print(list(p))
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4), ... , (4, 4, 2), (4, 4, 3), (4, 4, 4)]
于 2012-11-19T23:18:16.550 回答