2017-01-26 12 views
0

Ich arbeite am Euler Projekt, Problem 11, welches das Finden des größten Produktes aller möglichen Kombinationen von vier benachbarten Zahlen in einem Gitter beinhaltet. Ich habe die Zahlen in eine verschachtelte Liste verteilen und verwendet, um eine Liste Verständnis der relevanten Zahlen zu schneiden, wie folgt aus:Python Iterieren durch verschachtelte Liste mit Listenverständnis

if x+4 <= len(matrix[x]): #check right 
    my_slice = [int(matrix[x][n]) for n in range(y,y+4)] 

... und so weiter für die anderen Himmelsrichtungen. So weit, ist es gut. Aber wenn ich zu den Diagonalen komme, werden die Dinge problematisch. Ich habe versucht, zwei Bereiche wie folgt zu verwenden:

if x+4 <= len(matrix[x]) and y-4 >=0:# check up, right 
    my_slice = [int(matrix[m][n]) for m,n in ((range(x,x+4)),range(y,y+4))] 

Aber dies ergibt die folgende Fehlermeldung:

<ipython-input-53-e7c3ebf29401> in <listcomp>(.0) 
48  if x+4 <= len(matrix[x]) and y-4 >=0:# check up, right 
---> 49   my_slice = [int(matrix[m][n]) for m,n in ((range(x,x+4)),range(y,y+4))] 
ValueError: too many values to unpack (expected 2) 

Meine gewünschten Indizes für x, y-Werte von [0,0] wäre ['0,0','1,1','2,2','3,3']. Das scheint für die Verwendung der Enumerate-Funktion, um über eine Liste zu iterieren, nicht ganz anders, aber mir fehlt offensichtlich etwas.

P.S. Ich entschuldige mich für meine schreckliche variable Nomenklatur, ich bin ein work in progress.

+1

Versuchen Sie, die Bereiche zu zippen? – JETM

+0

Arbeiten Sie mit * arrays * oder * lists *? Sie sind nicht dasselbe. –

+0

Danke für die Klarstellung, es ist tatsächlich eine verschachtelte Liste. Bearbeitet um zu reflektieren. – SgtStens

Antwort

0

Sie brauchen nicht zwei Bereiche zu verwenden, einfach ein verwenden und wenden Sie es zweimal:

my_slice = [int(matrix[m][m-x+y]) for m in range(x,x+4)] 

Da Ihr n soll angebracht sein, um range(y,y+4) wir wissen, dass es immer eine Differenz von y-x zwischen m und n. Anstatt also zwei Variablen zu verwenden, können wir den Unterschied selbst ausgleichen.

Oder falls wünschen Ihnen noch zwei range(..) Konstrukte verwenden, können Sie zip(..) verwenden, die eine Liste von Generatoren nimmt, verbraucht sie gleichzeitig und emittiert Tupeln:

my_slice = [int(matrix[m][n]) for m,n in zip(range(x,x+4),range(y,y+4))] 

Aber ich denke, diese Leistung nicht verbessern wird, weil des Tupelpackens und -entpackens.

+0

/facepalm für nicht zu realisieren, die x-und y-Bereiche sind immer gleich. Ich mache mir keine Sorgen um die Leistung, da dies nur zu Lernzwecken dient. Danke, akzeptiert! – SgtStens

0

[int(matrix[x+d][n+d]) for d in range(4)] für eine Diagonale.
[int(matrix[x+d][n-d]) for d in range(4)] für die andere.

Btw, besser Standard-Matrix-Indexnamen verwenden, d. H. Zeile i und Spalte j. Nicht x und y. Es ist verwirrend. Ich glaube, du hast dich selbst verwirrt, wie zum Beispiel deine if x+4 <= len(matrix[x]) Tests x gegen die zweite Dimension Länge aber verwendet es in der ersten Dimension. Hä?

+0

Es wäre nicht das erste Mal, dass ich mich selbst verwirrt habe, danke für die konstruktive Kritik. Ich habe Probleme mit der Benennung von Variablen/Indexen. – SgtStens

Verwandte Themen