2016-04-19 7 views
-1

Wie setzen Sie 2 für Schleifen in eine if-Anweisung?So verschachteln Sie 2 für Schleifen in eine if-Anweisung

Ships = [ 
    ["Aircraft Carrier", 5], 
    ["Battleship", 4], 
    ["Submarine", 3],  
    ["Destroyer", 3], 
    ["Patrol Boat", 2] 
] 
ships_left = ["A","B","S","D","P"] 

if [ship for ship in ships_left name for name in Ships if name[0][0] == ship]: 
    print(name[0]) 

Erwartete Ausgabe:

Aircraft Carrier 

Dies liegt daran, wenn sie einmal beide iterieren dann sollten Schiff "A" gleich sein und den Namen ["Aircraft Carrier", 5] sein sollte, so sollte name[0][0]"A" sein.

Wie würden Sie dies für den Code tun, um unabhängig durch beide Listen zu iterieren und verzweigen auf eine gegebene ist die Zuordnung der beiden Listen?

+1

Können Sie uns die erwartete Ausgabe zur Verfügung stellen? – Aurel

+0

Können Sie die Logik und was Sie wollen als Ausgabe erklären, warum über alle Schiffe iterieren, wenn Sie nur die erste Übereinstimmung wollen? –

+0

In welchem ​​Zustand testen Sie? Was bedeutet "* eigentlich *"? Sie haben uns nicht gesagt, was Sie erreichen wollen. – cdarke

Antwort

2

berechnen, welche Schiffe übrig sind erste, bevor if zu verwenden, wenn es zu testen, waren alle: erste

left_names = [name for name, size in Ships if name[0] in ships_left] 
if left_names: 
    print(left_names[0]) 

Durch die Berechnung, welche Schiffe bleiben, können Sie das Ergebnis sowohl für die if Test wiederverwenden und die print() Funktion; Andernfalls müssten Sie zweimal dieselbe Berechnung durchführen.

Sie brauchen auch nicht zwei Schleifen; Sie müssen nur Ihre Ships Liste durchlaufen und jeden Namen gegen die ships_left Liste prüfen. Ich würde ships_left einen Satz machen, jedoch für eine schnellere Mitgliedschaft Prüfung:

ships_left = {"A", "B", "S", "D", "P"} 

Mitgliedschaft Tests in einer Liste führen zu N Stufen (wobei N die Länge der Liste ist), während in einer Reihe Mitgliedschaft Prüfung dauert konstante Zeit (O (1)). Dies macht ein Schiff zu entfernen, sobald es versenkt worden (oder auf dem Brett platziert) einfach und schnell zu:

ships_left.remove(name[0]) 

Sie die next() Funktion mit einem Generator Ausdruck verwenden könnten, wenn man nur das erste Spiel müssen; dies vermeidet alle Namen zu extrahieren:

ship_left = next((name for name, size in Ships if name[0] in ships_left), None) 
if ship_left: 
    print(ship_left) 

Demo:

>>> Ships = [ 
...  ["Aircraft Carrier", 5], 
...  ["Battleship", 4], 
...  ["Submarine", 3], 
...  ["Destroyer", 3], 
...  ["Patrol Boat", 2] 
... ] 
>>> ships_left = {"A", "B", "S", "D", "P"} 
>>> next((name for name, size in Ships if name[0] in ships_left), None) 
'Aircraft Carrier' 
>>> ships_left.remove('A') 
>>> next((name for name, size in Ships if name[0] in ships_left), None) 
'Battleship' 
>>> ships_left.clear() # remove all ships 
>>> next((name for name, size in Ships if name[0] in ships_left), None) is None 
True 
+1

Ich war nicht derjenige, der abstimmte, aber was ich suche ist eine Möglichkeit, zwei für Anweisungen in eine Zeile zu setzen, weil ich möchte, dass es kompakter ist, und ich kann nicht mehr Variablen in diesem Programm erstellen –

+0

@Frostyfeet: zwei für Aussagen * macht keinen Sinn * für Ihre Anforderungen. Sie würden am Ende das Produkt der beiden Listen produzieren und jeden Namen in einem gegen alle Namen in dem anderen testen. Das ist äußerst ineffizient und wird überhaupt nicht benötigt. –

+0

@Frostyfeet: und wenn Sie die Schleife in Ihre 'if' Anweisung setzen, müssten Sie die * gleiche Schleife wiederholen *, um den passenden Namen drucken zu können. Das ist es, wofür Variablen sehr gut sind, um ein Ergebnis zu speichern, so dass Sie es nicht erneut berechnen müssen. –

Verwandte Themen