python中的多个嵌套循环等效替换

Posted

技术标签:

【中文标题】python中的多个嵌套循环等效替换【英文标题】:Multiple nested loops equivalent replacement in python 【发布时间】:2017-11-17 19:29:26 【问题描述】:

我有一个D = 2: 4, 3: 2, 5: 1, 7: 1 形式的简单字典。有 4 个键是质数,4 个值代表最大功率。基于此,我想生成表单的所有组合:

p1^range1 * p2^range2 * p3^range3 * p4^range4

其中range1range4 是对应于每个素数的字典值的范围。对于p1 = 2,范围将为range(0, 4+1)

最简单的方法是嵌套四层 for 循环:

for i1 in range(0, 4+1):
   for i2 in range(0, 2+1):
      for i3 in range(0, 1+1):
         for i4 in range(0, 1+1):
            n = 2**i1 * 3**i2 * 5**i3 * 7**i4

这是我的意图,它是正确的,但这是一种不优雅和机械的方式。

另一种方法是使用itertools.product,如果所有范围都相同,则该方法有效。基本上是这样的:

for x in itertools.product(range(0, 4+1), repeat=4):
    print(x, end='   ')

但是,这将生成所有可能的组合,包括 (2, 2, 3, 4), (4, 4, 2, 3) 或 (2, 3, 4, 4) 在我的情况下无效,因为 5 的幂(这是元组中的第三个元素)永远不会是 3 和 7 的幂永远不会是 4。如果可能的话,我想以某种方式限制元素的范围。所以在这种情况下,最大元组将是 (4, 2, 1, 1) 对应于幂(字典 D 中的值)。所以基本上我只需要从 (0,0,0,0) 到 (4,2,1,1) 的元组范围。

有没有办法在不使用 for 循环的情况下实现这一点,并以与 itertools.product 类似的方法来实现?

非常感谢。

【问题讨论】:

那些不相等。你想要itertools.product(range(5), range(3), range(2), range(2)),或者itertools.product(*map(range, (5, 3, 2, 2))) 非常感谢。这正是我想要的。这解决了我的问题。 【参考方案1】:

其实

正如 miradulo 所写,解决方案非常简单: 要么使用:

for x in itertools.product(*map(range, (5, 3, 2, 2))) :
    print(x, end='   ')

或:

for x in itertools.product(range(5), range(3), range(2), range(2)) :
    print(x, end='   ')

两种方法都可以解决问题。

【讨论】:

【参考方案2】:

虽然itertools 是要走的路,但这个问题是练习生成器功能的绝佳练习:

def multirange(d):
    if len(d) == 1:
        for i in range(d[0]):
            yield [i]
    elif len(d) > 1:
        for i in range(d[-1]):
            for a in multirange(d[:-1]):
                yield a + [i]

def multirange_b(d):
    l = len(d)
    products = [1]
    for k in d:
        products.append(products[-1]*k)
    n = products[-1]
    for i in range(n):
        yield [(i%products[j+1])//products[j] for j in range(l)]

for l in multirange([4,3,2]):
    print(l)

for l in multirange_b([4,3,2]):
    print(l)

【讨论】:

以上是关于python中的多个嵌套循环等效替换的主要内容,如果未能解决你的问题,请参考以下文章

Python:替换多个 for 循环、多个迭代器

Python中的嵌套循环

Itertools 等效于嵌套循环“for x in xs: for y in ys...”

使用熊猫时python中的嵌套循环问题

嵌套多个“for”循环

您如何在方案中运行等效的嵌套 for 循环