0

我正在使用 Python 2.6 并找到了函数

[in] a=[[1,2,3],[1,2,3]]
[in] b=list(itertools.product(*a))

其中 a 是列表列表,结果是一个列表,其中包含从 a 中的每个列表中获取一个值的每个可能组合的元组。IE

[out]  [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]

当我开始使用 20 个列表的列表时问题就来了(结果将是 3**20 个不同的元组并溢出内存)。为了避免这些,我想在生成之前或期间创建所有元组之后应用我正在应用的约束。这种约束例如:

  • 总是连续两个 2
  • 1 秒的 40%
  • 不是 3 后 1 或 1 后 3 ...

有人可以帮助我使用可以执行此类操作的高级功能吗?

4

1 回答 1

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)]

附言:

itertools 具有与 product_with_validation: ifilter几乎相同的功能,您可能想要使用它,因为它可能比自定义编写的要快得多。

于 2013-08-30T09:52:31.277 回答