Seite 1 von 1
Anzahl von loops in for Schleife dynamisch ändern
Verfasst: Sonntag 19. August 2012, 21:36
von moccajoghurt
Habe folgendes Problem:
Ich durchlaufe eine for-Schleife und möchte in bestimmten Fällen, dass die durchlaufende Variable erhöht werden kann, um die Anzahl der Schleifendurchläufe zu verringern. Im folgenden Beispiel soll die Schleife eigentlich nur 5 mal durchlaufen werden, sie wird aber 10 mal durchlaufen (wie man am Wert von y erkennt):
Code: Alles auswählen
y = 0
for x in range(10):
if x % 2 == 0:
x = x + 1
y = y + 1
print(y)
Ich weiß, dass range() eine Liste erstellt, von daher unterscheidet sich die for-Schleife in Python von den "Klassischen" ein wenig. Wie kann ich dieses Problem in Python umsetzen? Geht das nur über eine while-Schleife, oder kann ich auch bei meiner for-Schleife bleiben? (mag die mehr)
Danke,
Gruß moccajoghurt
Re: Anzahl von loops in for Schleife dynamisch ändern
Verfasst: Sonntag 19. August 2012, 21:39
von BlackJack
@moccajoghurt: In dem Du die Bedingung umdrehst und den Rest des Schleifenkörpers in das ``if`` ziehst!?
Oder in diesem speziellen Fall natürlich in dem Du nur die relevanten `x` überhaupt erst erzeugst.

Re: Anzahl von loops in for Schleife dynamisch ändern
Verfasst: Montag 20. August 2012, 06:30
von snafu
Du könntest mittels `continue` sofort zum nächsten Durchlauf übergehen:
Code: Alles auswählen
result = 0
for i in range(10):
if i % 2 == 0:
continue
result += 1
print(result)
Stehst du denn vor einem größeren Problem, bei dem du das irgendwie brauchst?
//edit: Übrigens geht's auch ohne `continue` (wäre wohl das, was BlackJack ansprach):
Code: Alles auswählen
result = 0
for i in range(10):
if i % 2 != 0:
result += 1
print(result)
Und falls es um das reine Abzählen geht, dann reicht natürlich auch eine LC (`filter()` war mir hier zu umständlich, gerade für Python 3):
Wobei ich hinzufügen möchte, dass bei sehr großen Zahlen keine LC mehr verwendet werden sollte. Denn dann wird die hilfsweise verwendete Liste so groß, dass sie den Programmverlauf ausbremst. Da ist Schreibfaulheit dann keine annehmbare Ausrede mehr.

Re: Anzahl von loops in for Schleife dynamisch ändern
Verfasst: Montag 20. August 2012, 08:13
von EyDu
Oder, für dieses Beispiel:
Und wenn man so vorgeht wie snauf, dann sollte man die Liste (in diesem Fall) durch einen Generatorausdruck ersetzen:
oder gleich
Und wenn man es mit diesem Beispiel auf die spitze treiben will, dann natürlich
oder

Re: Anzahl von loops in for Schleife dynamisch ändern
Verfasst: Montag 20. August 2012, 17:39
von Hyperion
Von hinten durch die Brust ins Auge

Re: Anzahl von loops in for Schleife dynamisch ändern
Verfasst: Montag 20. August 2012, 17:55
von EyDu
In der Mittagspause hatte ich noch eine kleine Idee:
Hypersions Lösung ist natürlich die offensichtlich einzige wahre Lösung. In einem Wort: elegant

Re: Anzahl von loops in for Schleife dynamisch ändern
Verfasst: Montag 20. August 2012, 20:59
von jbs
Code: Alles auswählen
abs(reduce(add, map(lambda e: e*(1-2*(e%2)), range(10))))
Re: Anzahl von loops in for Schleife dynamisch ändern
Verfasst: Dienstag 21. August 2012, 15:43
von Leonidas
Ihh, lambdas. Da könnte man doch abstrakt mit compose und Operator-Funktionen das nachstellen.