【问题标题】:Iterating over variable number of iterables in Python在 Python 中迭代可变数量的可迭代对象
【发布时间】:2013-08-03 01:58:45
【问题描述】:

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

为了简单起见,假设如果给定序列是由生成器函数吐出的项目的任意组合,则该规则得到满足。生成器会处理池中的哪些项目将在其每个实例中弹出,并且不会总是产生相同的项目/订单,因此构建项目列表并使用 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 循环可能是解决这个问题的一步,但是当我试图纠正一个有效的问题时,我的大脑崩溃了。

有人能指出正确的方向吗?

【问题讨论】:

  • 您是在寻找itertools.product,还是我在这里遗漏了什么?
  • 似乎是适合这项工作的工具,我会在电脑前尝试一下。谢谢!

标签: python recursion iterator


【解决方案1】:

对于 N 项的排列:

def is_match_found(sequence):
    for itemList in itertools.product(list(item_generator()), repeat=N):
        if sequence in itemList:
            return True
    return False

【讨论】:

  • product 的 repeat 参数仅是关键字,因此这将尝试将 N 视为另一个可迭代对象,我认为这不是您想要的。
【解决方案2】:

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

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

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

product(A, repeat=4) 与product(A, A, A, A) 含义相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-26
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 2018-08-19
    • 2014-11-04
    相关资源
    最近更新 更多