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):

Code: Alles auswählen

len([i for i in range(10) if i % 2 != 0])
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:

Code: Alles auswählen

range(1, 10, 2)
Und wenn man so vorgeht wie snauf, dann sollte man die Liste (in diesem Fall) durch einen Generatorausdruck ersetzen:

Code: Alles auswählen

sum(1 for i in xrange(10) if i % 2 != 0)
oder gleich

Code: Alles auswählen

len(xrange(1, 10, 2))
Und wenn man es mit diesem Beispiel auf die spitze treiben will, dann natürlich
oder
:P

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

Code: Alles auswählen

len(list(compress(range(10), cycle((False, True)))))
:mrgreen:

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:

Code: Alles auswählen

sum(x-x/2*2 for x in range(10))
Hypersions Lösung ist natürlich die offensichtlich einzige wahre Lösung. In einem Wort: elegant :mrgreen:

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.