2016-05-13 66 views
-2

我试图遵守PEP8指导原则,而我遇到的一个问题是79字符限制。如果我像10x10数组一样工作,我倾向于使用嵌套循环来访问数组的特定元素。它看起来像这样:大型嵌套循环不遵循PEP8标准

size=10 
for i in range(size): 
    for k in range(size): 
     for j in range(size): 
      for l in range(size): 
       for m in range(size): 
        for n in range(size): 
         for p in range(size): 
          for q in range(size): 
           for r in range(size): 
            for s in range(size): 
             matrix[i][k][j][l][m][n][p][q][r][s]=matrix[i][k][j][l][m][n][p][q][r][s]*matrix[i][k][j][l][m][n][p][q][r][s] 

我该如何改变这适合字符行限制?

我重写了代码并重新命名了一些变量,现在适合!谢谢。

size=10 
def sq(element,power): 
    if power==1: 
     return element 
    else: 
     return element*sq(element,power-1) 

for i in range(size): 
    for j in range(size): 
     for k in range(size): 
      for l in range(size): 
       for m in range(size): 
        for n in range(size): 
         for p in range(size): 
          for q in range(size): 
           for r in range(size): 
            for s in range(size): 
             x=l[i][j][k][l][m][n][p][q][r][s] 
             l[i][j][k][l][m][n][p][q][r][s]=sq(x,2) 
+3

你应该重写它**这样做** - 问题不在于造型,它的方法。看看'itertools'或递归。 – jonrsharpe

+0

我假设命令'我,K,J'只是在那里混淆了任何人? –

+2

我非常怀疑你有一个有100亿个元素的矩阵对象.. – DSM

回答

1

虽然numpy的可能有效地处理这更优雅&,你可以尝试这样的:

from itertools import product 

for indicies in product(range(size), repeat=size): 
    (i, j, k, l, m, n, p, q, r, s) = indicies 
    matrix[i][j][k][l][m][n][p][q][r][s] **= 2 
+0

你缺少'o'?为什么不用'** = 2'而不是'* = self'? –

+0

@ TadhgMcDonald-Jensen,不会丢失'o',只是匹配OP的原始变量。 ** ='是一个很好的接触,保持在PEP8线的限制下 - 谢谢!尽管答案是关于使用索引排列来替代嵌套循环。仍然在等待10维测试代码实际返回结果,但是... – cdlane

+0

哈哈,是啊,只是'矩阵= [1] *(10 ** 10)'需要很长时间,然后用9'__getitem__'遍历它呼叫和一个'__setitem__'呼叫每一个....不要指望它很快结束。 –

1

像什么cdlane做了,但是也不要手动处理的指标。

from itertools import product, cycle 
from pprint import pprint 

def tuple_index(arr, index): 
    """ 
    tuple_index(arr, [i, j, ..., k]) == arr[i][j]...[k] 
    """ 
    result = arr 
    for i in index: 
     result = result[i] 
    return result 

def main(): 
    size = 4 
    dimensions = 3 

    # Build up sample matrix manually to test and demonstrate 
    source = cycle(range(20)) 
    matrix = [[[next(source) 
       for i in range(size)] 
       for j in range(size)] 
       for k in range(size)] 
    print('Before:') 
    pprint(matrix) 

    for index in product(range(size), repeat=dimensions): 
     inner_list = tuple_index(matrix, index[:-1]) 
     inner_list[index[-1]] *= inner_list[index[-1]] 

    print('\nAfter:') 
    pprint(matrix) 

main() 

输出:

Before: 
[[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]], 
[[16, 17, 18, 19], [0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]], 
[[12, 13, 14, 15], [16, 17, 18, 19], [0, 1, 2, 3], [4, 5, 6, 7]], 
[[8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19], [0, 1, 2, 3]]] 

After: 
[[[0, 1, 4, 9], [16, 25, 36, 49], [64, 81, 100, 121], [144, 169, 196, 225]], 
[[256, 289, 324, 361], [0, 1, 4, 9], [16, 25, 36, 49], [64, 81, 100, 121]], 
[[144, 169, 196, 225], [256, 289, 324, 361], [0, 1, 4, 9], [16, 25, 36, 49]], 
[[64, 81, 100, 121], 
    [144, 169, 196, 225], 
    [256, 289, 324, 361], 
    [0, 1, 4, 9]]]