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

2024-10-01 05:02:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有:我有列表List123=[-13,3,12,1]和2乘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×27矩阵做同样的处理。这意味着,如果我找不到更简洁的方法,我必须手动为循环编写23*27=621的代码。在


Tags: 方法代码innumpy终端列表forzeros
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,即使{},因为所有这些排列将填充地球上所有的存储,这是荒谬的次数,打印他们所有将需要直到宇宙热死。在

我强烈建议您在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))

下面是一个纯递归函数版本:

^{pr2}$

在这两种情况下,都有65536个结果。在

您可以使用^{}

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形式输出结果,您可以动态地创建它们(尽管这需要花费更多的时间)。在

^{pr2}$

或者使用^{}来提高可读性(感谢@MenglongLi)

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

它会给你65536个预期的结果。在

相关问题 更多 >