Bedingte list comprehension
Ich versuche besser zu verstehen, wie die Liste Verstehens Arbeit.
Ich habe die folgende Funktion, die true oder false zurückgibt wenn eine Zahl eine Primzahl ist (das fand ich irgendwo im forum, aber kann mich nicht erinnern, wo):
import math
def is_prime(n):
if n % 2 == 0 and n > 2:
return False
for i in range(3, int(math.sqrt(n)) + 1, 2):
if n % i == 0:
return False
return True
wenn ich laufen:
[x for x in range(2, num) if is_prime(x)]
bekomme ich das gewünschte Ergebnis
[2, 3, 5, 7, 11, 13, 17, 19]
bei dem Versuch, zu konvertieren die gesamte Funktion auf eine Liste, die das Verständnis, die ich kam mit:
[x if not (x%2==0 and x > 2) else x for x in range (2, num)
for i in range(3, int(x**(1/2))+1, 2) if not (x%i==0)]
produziert:
[10, 11, 13, 14, 16, 17, 19]
nicht sicher, wohin ich gehe falsch und würde schätzen etwas Hilfe. In Wahrheit denke ich, es ist besser, verwenden Sie die Funktion in diesem Fall, aber wie ich schon sagte, ich bin versucht, zu verstehen, die Liste Verständnis und seine Fähigkeiten.
- dass nur die Renditen der ungeraden zahlen und schließt 2. OP ist auch ohne zahlen durch 3 teilbar.
- Ich würde sagen, das ist zu viel, quetschen sich in eine Liste Verständnis. Es ist ok zum üben, aber nicht so etwas wie, dass, wenn jemand anderes hat, es zu Lesen.
- Nur für kichert ich zeitlich jede version: die Funktion
[x for x in range(2, num) if is_prime(x)]
version war 9.01 s pro loop; @Julien-version (mit meiner geringfügigen änderungen): 12.8 s pro loop und @Harshit Garg version: 44.4 s pro loop.
InformationsquelleAutor Infinity Cliff | 2017-04-04
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie dies tun:
obwohl ein liner nur für die Zwecke ist es nicht unbedingt eine gute Sache. IMO mit einer prime-tester-Funktion, wie Sie tun, ist besser...
HINWEIS: was nicht in Ihren versuchen, ist, dass Sie verändert die Logik der äußeren Liste Verständnis. Sie wollen immer noch eine Struktur wie
[n for n in range(...) if (expression testing if n is prime)]
.[n for n in range(2, num) if (n % 2 != 0 or n ==2) and all(n % i != 0 for i in range(3, int(math.sqrt(n)) + 1, 2))]
. Nicht sicher, ob ich verstehe, warum die Antwort, die funktioniert, aber ohne " 2 " ist, aber anschauen werden es einige mehr.n>2
zun==2
.Das Hauptproblem ist, dass Sie einen gewundenen übersetzung. Versuchen Vereinfachung der ursprünglichen Bedingung, so dass Sie wieder "x, wenn x==2, sonst x ..." wie du es bereits getan habe. Ich bin nur geben Sie einen führenden Tipp hier; von dem, was Sie getan haben, bereits, ich denke, man kann es herausfinden.
Wenn nicht, versuchen Sie, die Vereinfachung der "else" - Ausdruck so lernen Sie die Logik der Klausel. Dann bin ich sicher, Sie werden es bekommen. Du machst das gut.
Gibt es logische Fehler im code oben
1/2
ausgewertet zu 0, nicht 0,5. Um das zu tun, verwenden Sie entweder 0,5 oder 1/2.0 oder 1.0/2Es auch nicht kümmern 2 als Spezialfall. als
(for i in range(3, int(x**(1/2.0))+1, 2) if not (x%i==0))
wird nicht ausgeführt,for i in range(3, int(x**(1/2.0))+1, 2) if not (x%i==0)
ist auch ein logischer Fehler, als wenn diese Bedingung erfüllt ist, verursacht es mehrere Einträge Hinzugefügt werdender korrekte Weg wäre
(1/2)
ausgewertet0.5
für mich, nicht sicher, ob das Problem, das Sie angegeben ist, ist in der älteren version von Python, aber, deine Antwort funktioniert