我正在使用Python 2.6并找到了函数
[in] a=[[1,2,3],[1,2,3]]
[in] b=list(itertools.product(*a))
其中a是列表列表,结果是一个列表,其中包含从每个列表中取一个值的每个可能组合的元组。即。
[out] [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
当我开始处理20个列表的列表时,问题出现了(结果将是3 ** 20个不同的tupples并溢出内存)。 为了避免这些,我想在生成之前或期间创建所有tupples之后应用我正在应用的约束。 这种约束是例如:
有人可以帮助我使用可以执行此类操作的高级功能吗?
答案 0 :(得分:1)
关于itertools的一个好处是它们没有使用太多内存,它们只返回一个迭代器。 然后你可以做类似的事情:
def valid_combination(combination):
# Do whatever test you want here
pass
def product_with_validation(validation_func, *element_list):
for combination in itertools.product(*element_list):
if validation_func(combination):
yield combination
all_combinations = list(product_with_combo(product_with_validation, [1,2,3],[1,2,3])
product_with_combo还会返回一个节省大量内存的迭代器。
例如:
import itertools
def valid_combination(combination):
return len(combination)>0 and combination[0]==2
def product_with_validation(validation_func, *element_list):
return (combination for combination in itertools.product(*element_list)
if valid_combination(combination))
print list(product_with_validation(valid_combination, range(10), range(10)))
结果:
[(2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9)]
PS:
itertools有一个与product_with_validation完全相同的函数:ifilter,您可能想要使用它,因为它可能比自定义编写的快得多。