2016-03-27 11 views
-1

Das Ziel dieser Schleife wird für jedes star Element (bestehend aus x und y Koordinaten in der Form von [int, int]) in der Liste stars, die Berechnung der Entfernung und Winkel zu jeder anderen starPython: Iterieren über Array mit zwei verschachtelten Schleifen

#list to store lists of distances 
star_map = [] 

#go through each star to calculate distance from this star 
for star in stars: 

    print("main loop") 

    sub_map = [] #list of distances from this star 


    for sub_star in stars: 

     print("sub loop") 

     #find distance 
     dx = float(star[0]-sub_star[0]) 
     dy = float(star[1]-sub_star[1]) 

     #if distance is zero, break because it's the same star 
     if(dx == 0 and dy == 0): 
      break 

     #otherwise get distance and angle  
     dist = np.sqrt(dx ** 2 + dy ** 2) 
     theta = get_theta(dx, dy) 

     #add it to a list of distances from this star 
     sub_map.append((dist, theta)) 
     print("sub loop") 

    #add the list of distances from this star to the main list  
    star_map.append(sub_map) 

Was ich erwarte, ist, dass es eine „Hauptschleife“ von „sub-Loop“ len(stars) - 1 mal gefolgt druckt. (-1, denn wenn der Stern in den inneren und äußeren Schleifen gleich ist, und ich möchte, dass ignorieren)

Was passiert ist, dass ich diese:

main loop 
main loop 
sub loop 
main loop 
sub loop 
sub loop 
main loop 
sub loop 
sub loop 
sub loop 

etc, etc, bis die letzte Schleife, wenn die erwartete Anzahl von "Sub-Loop" -Zeilen gedruckt wird.

dh jedes Mal durchläuft es einen weiteren Stern.

Warum passiert das und wie kann ich jeden Stern jedes Mal durchlaufen?

Edit: Das Problem war, dass anstelle der Fortsetzung, ich Pause verwendet, um die Schleife zu stoppen, wenn der Stern in der Nebenschleife der gleiche wie die äußere Schleife war. Ändern zum Fortfahren behoben dies.

+1

Beachten Sie, dass Sie eine Klausel "break" haben, auch haben Sie zwei "sub loop" Drucke. OTOH Ich glaube nicht, dass dieser Code die von dir beschriebene Ausgabe erzeugen soll. Bitte überprüfen Sie erneut. – wRAR

+0

hi, (dx == 0 und dy == 0) sollte nur einmal wahr sein, wenn das Sternelement in den äußeren und inneren Schleifen gleich ist. Also sollte ich len (Sterne) - 1 "sub loop" Zeilen sehen. – Tim

+0

die Frage bearbeitet, um das widerzuspiegeln – Tim

Antwort

0

Die Anweisung break bewirkt, dass die Sub-Schleife bricht und zur Hauptschleife zurückkehrt, wenn sie auf denselben Stern trifft. Was Sie wollen, ist für die Sub-Schleife überspringen diese Iteration. Verwenden Sie continue anstelle von break.

+0

Danke, das hat es behoben. werde akzeptieren, wenn es mich lässt. – Tim

+1

Da 'continue' die Schleife veranlaßt, * den * Stern * zu überspringen, darf die gesamte Unterschleife nicht ganz verlassen werden, und man muss aufhören, den Rest der sub_stars zu betrachten. Die [docs] (https://docs.python.org/2/tutorial/controlflow.html) erklären dieses Verhalten von 'break' und' continue' gut. –

+1

@PadraicCunningham Es gibt zwei verschachtelte Schleifen - das Problem ist, dass die Verwendung von "break" die innere Schleife abbricht und zum nächsten Stern in der Hauptschleife zurückkehrt. Das ist der Zweck von "Pause". Versuchen Sie es selbst: for i in range (10): print (i) für j in Bereich (11,21): if (j == 13): Pause sonst: print (j) Wird 13 gedruckt? –

Verwandte Themen