2016-05-13 3 views
-2

Ich versuche, die PEP8-Richtlinien einzuhalten, und eine, mit der ich Probleme habe, ist die Zeilengrenze von 79 Zeichen. Wenn ich etwas wie ein 10x10-Array arbeite, nutze ich normalerweise verschachtelte Schleifen, um auf bestimmte Elemente des Arrays zuzugreifen. Es sieht so aus:Große verschachtelte Schleife, die nicht den PEP8-Standards entspricht

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] 

Wie sollte ich dies ändern, um die Grenze der Zeichenlinie anzupassen?

Ich habe den Code rekursiv umgeschrieben und einige Variablen umbenannt, jetzt passt es! Vielen Dank.

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

Sie sollten es neu schreiben zu ** nicht tun ** - das Problem ist nicht das Styling ist, dann ist es der Ansatz. Schau dir 'itertools' oder Rekursion an. – jonrsharpe

+0

Ich nehme an, die Reihenfolge 'i, k, j' ist nur da, um jeden zu verwirren? –

+2

Ich bezweifle sehr, Sie haben ein Matrix-Objekt mit zehn Milliarden Elemente drin .. – DSM

Antwort

1

Obwohl numpy wahrscheinlich diesen eleganten & Griffe effizient, könnten Sie so etwas wie versuchen:

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

Sie vermissen 'o'? Und warum nicht "** = 2" statt "* = selbst"? –

+0

@ TadhgMcDonald-Jensen, nicht "O" fehlt, nur die ursprünglichen OP-Variablen entsprechen. Das '** =' ist eine nette Geste, um unter der PEP8-Grenze zu bleiben - danke! Obwohl die Antwort darin bestand, Indexpermutationen als Ersatz für verschachtelte Schleifen zu verwenden. Warte immer noch auf 10-dimensionalen Testcode, um tatsächlich ein Ergebnis zurückzugeben, aber ... – cdlane

+0

lol, yeah nur 'matrix = [1] * (10 ** 10)' dauert sehr lange, dann geht es mit 9 '__getitem__' Anrufe und ein '__setitem__' rufen jeden an .... Erwarten Sie nicht, dass es bald fertig ist. –

1

Wie, was cdlane tat, sondern auch die Indizes behandeln nicht manuell.

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() 

Ausgang:

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]]] 
Verwandte Themen