如何在几行Python代码中编写许多嵌套的for循环?

时间:2017-09-12 14:17:30

标签: python numpy for-loop recursion nested-loops

我拥有的内容:我有列表List123=[-13,3,12,1]和2 x 4矩阵Matrix123=numpy.zeros((2,4), dtype=Decimal)

我想要的是什么:我想将矩阵的所有条目更改为列表的任何条目,然后将其打印到终端。有4 ^(2 * 4)= 65536种可能的组合。我想打印每个组合。

我现在该怎么做:以下是我目前的代码:

List123=[-13,3,12,1]

Matrix123=numpy.zeros((2,4), dtype=Decimal)

k=0
for k in List123:
    Matrix123[0,0]=k
    for k in List123:
        Matrix123[0,1]=k
        for k in List123:
            Matrix123[0,2]=k
            for k in List123:
                Matrix123[0,3]=k
                for k in List123:
                    Matrix123[1,0]=k
                    for k in List123:
                        Matrix123[1,1]=k
                        for k in List123:
                            Matrix123[1,2]=k
                            for k in List123:
                                Matrix123[1,3]=k
                                print Matrix123
                                print " "

我的问题: 什么是更简洁的方法,只用几行代码就可以写出来?我需要对23-by-27做同样的事情矩阵。这意味着如果我找不到更紧凑的方法,我必须手动编写23 * 27 = 621 for循环的代码。

3 个答案:

答案 0 :(得分:3)

我强烈建议您在python内置工具中使用itertools:

from itertools import product
import numpy as np

List123 = [-13, 3, 12, 1]

for i in product(List123, repeat=8):
    print(np.array(i).reshape(2, 4))

这是一个纯粹的递归函数版本:

import numpy as np

List123 = [-13, 3, 12, 1]

def dfs(depth=1, result=None):
    if result is None:
        result = []
    if depth == 9:
        print(np.array(result).reshape(2, 4))
        return

    for i in List123:
        dfs(depth + 1, result + [i])

dfs()

两种方式都有65536个结果。

答案 1 :(得分:3)

使用np.meshgrid

def my_product(list, shape = (4,2)):
    r = np.product(shape)
    out = np.stack(np.meshgrid(*(List123,) * r))
    out = out.reshape(shape[::-1] + (-1,)).T
    for mat in list(out):
        print(mat)

当然,如果您的shape(23,27),即使memerror也会导致len(list) = 2,因为所有这些排列都会填充地球上所有存储空间的荒谬数字时间结束,并将它们打印出来,直到宇宙的热量消失。

答案 2 :(得分:0)

您可以使用itertools.product

import itertools

list123 = [-13, 3, 12, 1]

for matrix in itertools.product(list123, repeat=8):
  print matrix

它将使用-13, 3, 12 and 1输出长度为8的所有可能解。 matrix将是一个包含8个数字的元组,是可能的解决方案。

如果您需要它以真实numpy.matrix形式输出结果,您可以动态创建它们(即使它需要更多时间)。

import numpy as np

for prod in itertools.product(list123, repeat=8):
  print np.matrix([prod[:4], prod[4:]])

或使用reshape提高可读性(感谢@MenglongLi)

for prod in itertools.product(list123, repeat=8):
  print np.reshape(prod, (2, 4))

它会按预期给你65536个结果。