2017-09-28 2 views
1

Ich versuche, den folgenden Code als One-Liner schreiben.Nested List Comprehension mit Flow Control

for x in range(a, b+1): 
    prime = True 
    for y in range(2, int(x**0.5)): 
    if x%y == 0: 
     prime = False 
     break 
    if prime: 
    return x 

Dies ist die Suche nach Primzahlen zwischen a und b. Ich werde jede Primzahl in einer Liste speichern. Der obige Code prüft jede Zahl im Primzahlbereich. Das Problem ist, dass ich diese verschachtelte Schleife als ein einzeiliges Listenverständnis schreiben muss. Das Problem, das ich habe, ist, dass das Listenverständnis die zweite Schleife nicht durchlaufen wird. Es wird mit 2 überprüft, dann aus der Schleife herausspringen.

habe ich versucht, diesen Ansatz, und es scheiterte kläglich: ([x for x in range(10, 21) for y in range(2, int(x**0.5)) if x%y != 0])

+0

Sie Code, den Sie gezeigt haben, hat nicht viel Sinn. 'next' ist eine eingebaute Funktion, die Sie auf einem Iterator aufrufen können, es ist keine Anweisung, wie Sie es hier scheinen. Meinst du vielleicht "weitermachen"? Das ist eine Aussage, obwohl es die äußere Schleife, die ich denke, dass Ihr Algorithmus benötigt, um richtig zu funktionieren, nicht fortsetzen wird. Du könntest es mit 'break' im' if' arbeiten lassen und die return-Zeile in einen 'else'-Block einfügen, der an die innere' for'-Schleife angehängt ist (ein komisches Bit der Python-Syntax). – Blckknght

+0

Warum scheint es, dass es aus der Schleife "herausspringt"? Die von Ihnen angegebene Codezeile wird keine sichtbare Ausgabe erzeugen. Der Teil Ihres Codes in eckigen Klammern ist ein Listenverständnis, das Sie normalerweise an einen Variablennamen binden würden. Dann können Sie es zum Beispiel ausdrucken, und erst dann sehen Sie, ob etwas darin ist. –

+0

Warum würden Sie es als Listenverständnis schreiben? Du willst keine Liste; Sie möchten einen einzelnen Wert. – chepner

Antwort

0
Prime_numbers_list = [x for x in range(a, b+1) 
         if all(x%y !=0 for y in range(2, int(x**0.5)))] 
+0

x/2 ist nicht dasselbe wie x ** 0,5. –

+0

Das funktioniert perfekt! Ich wusste nicht über die gesamte Funktion. Das ist sehr hilfreich. – ddcastrodd

+0

@ddcastrodd, ich glaube nicht, dass eine * perfekte * Liste von Primzahlen 1, 4, 6, 8, 9, 15, 25, 35 usw. enthält.was dieser Code momentan erzeugt, wenn ich ihn ausführe. Der Fehler ist 'int (x ** 0.5)' sollte 'int (x ** 0.5) + 1' sein, da es der Endpunkt eines Bereichs ist. – cdlane

2

Ich würde eine innere Liste der modularen Ergebnisse bauen, und prüfen Sie, ob es irgendwelche Nullen sind:

[x for x in range(10, 21) if 0 not in (x%y for y in range(2, int(x**0.5)))] 
1

Wenn ich Verstehen Sie Ihre Absicht richtig, Sie versuchen, die kleinste Primzahl zwischen a und b in einer einzigen Zeile zu finden. Sie haben etwas aktuellen Code, aber was Sie gezeigt haben, ergibt keinen Sinn. Ich denke, die Logik, die Sie so zu zeigen versuchen, funktionieren könnte:

def find_prime_between(a, b): 
    for x in range(a, b+1): 
     for y in range(2, int(x**0.5)): 
      if x%y == 0: 
       break 
     else: 
      return x 

Eine Möglichkeit, dies in einen Einzeiler zu drehen ist, um die all eingebaute Funktion nutzen zu können. Sie kann die innere Schleife ersetzen, einschließlich des Kurzschlussverhaltens, das von den Blöcken break und else kam. Für die äußere Schleife, würde ich vorschlagen Aufruf next auf einem Generator, der den ersten Wert durch den Generator lieferte bekommt:

result = next(x for x in range(a, b+1) if all(x % y != 0 for y in range(2, int(x**0.5)))) 

standardmäßig next wird StopIteration erhöhen, wenn der Generator etwas nicht nachgibt (weil es sind keine Primzahlen zwischen a und b). Wenn Sie möchten, dass in dieser Situation ein anderer Wert zurückgegeben wird (z. B. None), können Sie ihn als zweites Argument an next übergeben. Das wird der Generator Ausdruck erfordert in Klammern eingewickelt werden, da es nicht das einzige Argument:

result = next((x for x in range(a, b+1) if all(x%y!=0 for y in range(2, int(x**0.5)))), None) 

, die ein bisschen quetschen nimmt ohne Bildlaufleiste in dieser Antwort auf eine einzige Zeile zu passen.

Verwandte Themen