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)]
附言:
itertools 具有与 product_with_validation: ifilter几乎相同的功能,您可能想要使用它,因为它可能比自定义编写的要快得多。