在Python中为任何n嵌套n循环

Sch*_*ote 1 python iteration python-3.x

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

for x in numbers:
    for y in numbers:
        print(x*y)
Run Code Online (Sandbox Code Playgroud)

现在,如果我想将该列表中的每个数字相乘,该列表中的每个数字都会再次对该列表中的每个数字进行计时,我会这样做:

for x in numbers:
    for y in numbers:
        for z in numbers:
            print(x*y*z)
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*ger 6

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

from functools import reduce
from operator import mul

for numset in itertools.product(numbers, repeat=n):
    print(reduce(mul, numset))
Run Code Online (Sandbox Code Playgroud)

上面很简单,但是当值集很大时,它将不必要地重新计算部分产品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)
Run Code Online (Sandbox Code Playgroud)