Python 中任意 n 的嵌套 n 循环

Nest n loops for any n in Python

所以,假设我有一个任意长的数字列表。我想获得该列表中每个数字乘以该列表中每个数字的列表。我会通过像这样嵌套 for 循环来做到这一点:

for x in numbers:
    for y in numbers:
        print(x*y)

现在,如果我想将该列表中的每个数字乘以该列表中的每个数字再乘以该列表中的每个数字,我会这样做:

for x in numbers:
    for y in numbers:
        for z in numbers:
            print(x*y*z)

我的问题是我正在为子图搜索图,我需要允许任意大的子图。为此,我必须从主图中的边构造每个子图 n 边 - 我必须允许 n 的任意值.怎么样?

itertools.product 具有迭代乘积计算功能(我赞成reduce(mul, ...))。如果您需要n路产品(在"product"这个词的两个意义上):

from functools import reduce
from operator import mul

for numset in itertools.product(numbers, repeat=n):
    print(reduce(mul, numset))

上面很简单,但是当值集很大n >= 3时,会不必要地重新计算部分乘积。可以使用递归函数来避免这种情况:

def compute_products(numbers, repeat):
    if repeat == 1:
        yield from numbers
        return
    numbers = tuple(numbers)  # Only needed if you want to handle iterator/generator inputs
    for prod in compute_products(numbers, repeat-1):
        yield from (prod * x for x in numbers)

for prod in compute_products(numbers, n):
    print(prod)

我认为某种递归函数可能会对您有所帮助。这只是输入到 Stack Overflow 编辑器中的未经测试的伪代码,因此请注意逐字使用,但类似这样的内容:

def one_dimension(numbers, n):
    if (n < 1):
        return
    for num in numbers:
        for next_num in one_dimension(numbers, n-1):
            yield num*next_num

基本思路是函数的每个"level"调用下一个,然后处理下一个产生的东西。我不知道你对 Python 的 yield 关键字有多熟悉,但如果你知道它的作用,那么你应该能够修改上面的代码。

更新: 或者像 ShadowRanger 在他的回答中建议的那样使用 itertools.product;这可能是您问题的更好解决方案。