Anzahl von loops in for Schleife dynamisch ändern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
moccajoghurt
User
Beiträge: 23
Registriert: Freitag 20. Juli 2012, 15:12

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
Zuletzt geändert von moccajoghurt am Sonntag 19. August 2012, 21:39, insgesamt 1-mal geändert.
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. :-)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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. ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Von hinten durch die Brust ins Auge

Code: Alles auswählen

len(list(compress(range(10), cycle((False, True)))))
:mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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:
Das Leben ist wie ein Tennisball.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Code: Alles auswählen

abs(reduce(add, map(lambda e: e*(1-2*(e%2)), range(10))))
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ihh, lambdas. Da könnte man doch abstrakt mit compose und Operator-Funktionen das nachstellen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten