0

案例:我需要找出三个对象组合是否满足一个规则。

为简单起见,假设给定序列是由生成器函数吐出的项目的任意组合,则满足规则。生成器处理池中的哪些项目将在其每个实例中弹出,并且不会总是产生相同的项目/订单,因此构建项目列表并使用类似itertools.combinations生成组合的东西是行不通的。

现在我有一个相当于:

def is_match_found(sequence):

  items1 = items_generator()

  for item1 in items1:
    items2 = items_generator()

    for item2 in items2:
      items3 = items_generator()

      for item3 in items3:
        if sequence in [item1, item2, item3]:
          return True

  return False

但我预见到未来我需要查看n生成器吐出的对象组合是否满足规则。

我觉得一个带有n实现递归for循环的参数的函数可能是解决这个问题的一步,但是当我试图纠正一个有效的问题时,我的大脑会崩溃。

有人可以指出我正确的方向吗?

4

2 回答 2

0

对于 N 项的排列:

def is_match_found(sequence):
    for itemList in itertools.product(list(item_generator()), repeat=N):
        if sequence in itemList:
            return True
    return False
于 2013-08-01T23:00:51.280 回答
0

如果您正在寻找“具有n实现递归for循环的参数的函数”,并且“递归”实际上是指“嵌套”......那么它已经存在:itertools.product. 事实上,简短的描述甚至是:

笛卡尔积,相当于嵌套的 for 循环

但它没有n参数;它有一个iterables参数,允许您指定要嵌套的多个单独的迭代器。如果你只想嵌套相同的迭代n次数,你可以传递n相同迭代的副本列表……但你也可以只使用repeat关键字来指定。正如文档所说:

product(A, repeat=4)意思相同product(A, A, A, A)

于 2013-08-01T23:01:56.077 回答