首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python代码的几行代码中编写许多嵌套的for-循环?

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

Stack Overflow用户
提问于 2017-09-12 14:17:30
回答 3查看 283关注 0票数 4

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

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

我现在是怎么做的:这里是我的当前代码:

代码语言:javascript
复制
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 for -循环的代码。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-12 14:30:53

您可以使用itertools.product

代码语言:javascript
复制
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表单中输出结果,您可以动态创建它们(尽管这需要更多的时间)。

代码语言:javascript
复制
import numpy as np

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

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

代码语言:javascript
复制
for prod in itertools.product(list123, repeat=8):
  print np.reshape(prod, (2, 4))

它将给你65536预期的结果。

票数 0
EN

Stack Overflow用户

发布于 2017-09-12 14:26:54

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

代码语言:javascript
复制
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))

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

代码语言:javascript
复制
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的结果。

票数 3
EN

Stack Overflow用户

发布于 2017-09-12 15:28:55

使用np.meshgrid

代码语言:javascript
复制
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 --所有这些排列都会填满地球上所有的存储空间--数量多得可笑,并且打印它们都需要花费很长时间,直到宇宙的热死。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46178845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档