【问题标题】:How to spawn nested loops in python如何在python中生成嵌套循环
【发布时间】:2013-10-07 21:31:09
【问题描述】:

我已经尝试寻找这个问题的答案并阅读了很多关于装饰器和全局变量的内容,但没有找到任何与手头的问题完全相关的东西:我想对 N- 进行所有排列长度使用A-alphabet、fxn(A,N)。我将传递函数 2 个参数:AN。它将生成长度为N 的虚拟结果。然后,使用N 嵌套的for 循环,它将使用A 的每个元素从最内层循环开始更新结果的每个索引。所以fxn(‘01’,4) 会产生

1111, 1110, 1101, 1100, 1011, 1010, 1001, 1000, 
0111, 0110, 0101, 0100, 0011, 0010, 0001, 0000

如果您知道需要多少个嵌套循环,这样做很简单(N;尽管超过 4 个它开始变得非常混乱和麻烦)。但是,如果您想使用 A 制作所有任意长度的序列,那么您需要一些方法来自动化这种循环行为。特别是,我还希望此函数充当生成器,以防止必须将所有这些值存储在内存中,例如使用列表。要开始它需要初始化第一个循环并使用单个值更改(要更新的索引)N-1 次来继续初始化嵌套循环。然后它将产生最内层循环的值。

fxn('01',4) 的直接方法是:

for i in alphabet:
    tempresult[0] = i
    for i in alphabet:
        tempresult[1] = i
        for i in alphabet:
            tempresult[2] = i
            for i in alphabet:
                tempresult[3] = i
                yield tempresult

基本上,我怎样才能将它扩展到任意长度的列表或字符串,并且仍然让每个嵌套循环更新适当的索引。我知道作为 numpy 的一部分可能有一个置换函数可以做到这一点,但我还没有遇到过。任何建议将不胜感激。

【问题讨论】:

  • 你想要itertools.permutations(),在标准库中——或者,更有可能的是itertools.product('01', repeat=4)
  • 实际上,我不认为numpy 有一个简单的方法可以做到这一点。您可以在每个递归步骤中使用结合tilerepeat 的递归函数,但这似乎不是很简单或高效。

标签: python loops nested


【解决方案1】:

您实际上并不想要这里的排列,而是alphabet*alphabet*alphabet*alphabet 的笛卡尔积。你可以写成:

itertools.product(alphabet, repeat=4)

或者,如果您想返回字符串而不是元组:

map(''.join, itertools.product(alphabet, repeat=4))

(在 2.x 中,如果您希望它返回惰性迭代器而不是列表,就像您的原始代码一样,请使用 itertools.imap 而不是 map。)


如果你想用 numpy 做到这一点,我能想到的最好的方法是使用一个递归函数,为每个因素平铺和重复,但this answer 有一个更好的实现,你可以从那里复制,或者显然退出scikit-learnsklearn.utils.extmath.cartesian,然后就这样做:

cartesian([alphabet]*4)

当然,这会为您提供一个由单个数字字符串组成的二维数组;您仍然需要多一步将其展平为 N 位字符串的一维数组,并且 numpy 会减慢您的速度,而不是加快产品计算的速度,所以……除非您确实需要一个 numpy 数组,否则我'在这里坚持itertools

【讨论】:

    【解决方案2】:

    您可以查看itertools.permutations 函数的工作原理。

    【讨论】:

      猜你喜欢
      • 2021-07-07
      • 2016-11-18
      • 1970-01-01
      • 2021-02-22
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多