Schleifen - Anfängerfrage

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
Freumel
User
Beiträge: 28
Registriert: Donnerstag 25. Januar 2018, 13:47

Donnerstag 10. Januar 2019, 01:45

Hallo zusammen,

ich habe eine kurze frage (einfach aus Interesse).
Folgender Script funktioniert:

Code: Alles auswählen

fac = [1,2,3,4,5]
b = [2*a for a in fac]
zuvor habe ich so etwas immer so programmiert:

Code: Alles auswählen

fac = [1,2,3,4,5]
b =[]	# Wahlweise auch die ersten beiden Zeilen zusammengefasst: fac,b=[[1,2,3,4,5],[]]
for a in fac:
	b.append(a)
Ist es möglich auch folgendes in zwei Zeilen zu packen:

Code: Alles auswählen

fac = [1,2,3,4,5]
b = 0
for a in fac:
	b += a
Einfach nur aus Interesse :)

Liebe Grüße & Vielen Dank
Benutzeravatar
ThomasL
User
Beiträge: 556
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Donnerstag 10. Januar 2019, 07:13

ersteres geht auch so:
b = list(map(lambda x:x*2, fac))

und letzteres einfach so:
b = sum(fac)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
__blackjack__
User
Beiträge: 2527
Registriert: Samstag 2. Juni 2018, 10:21

Donnerstag 10. Januar 2019, 08:16

Und falls es `sum()` nicht bereits gäbe:

Code: Alles auswählen

from functools import reduce
from operator import add

fac = [1, 2, 3, 4, 5]
b = reduce(add, fac, 0)
“All tribal myths are true, for a given value of 'true'.” – Terry Pratchett, The Last Continent
Benutzeravatar
sparrow
User
Beiträge: 1021
Registriert: Freitag 17. April 2009, 10:28

Donnerstag 10. Januar 2019, 08:28

@Freumel bitte beachte, dass List Comprehensions, also das, was du in deinem Post zeigst, nicht automatisch ein Ersatz für for-Schleifen sind. Sie dienen dazu Listen zu erstellen. Wenn das Ergebnis keine Liste sein soll, ist der Weg darüber wahrscheinlich falsch.
Freumel
User
Beiträge: 28
Registriert: Donnerstag 25. Januar 2018, 13:47

Donnerstag 10. Januar 2019, 12:14

sparrow hat geschrieben:
Donnerstag 10. Januar 2019, 08:28
@Freumel bitte beachte, dass List Comprehensions, also das, was du in deinem Post zeigst, nicht automatisch ein Ersatz für for-Schleifen sind. Sie dienen dazu Listen zu erstellen. Wenn das Ergebnis keine Liste sein soll, ist der Weg darüber wahrscheinlich falsch.
Genau deswegen frage ich.
Oft habe ich auch einen String in Form von

Code: Alles auswählen

text, out = ['Das','ist','toll'],''
for word in text:
	out += word
Und da frage ich mich, ob es auch als Zweizeiler möglich ist (Leerzeichen zwischen den Wörtern mal dahingestellt)
Benutzeravatar
__blackjack__
User
Beiträge: 2527
Registriert: Samstag 2. Juni 2018, 10:21

Donnerstag 10. Januar 2019, 12:20

@Freumel: Da ist in der Tat ein Zweizeiler möglich und auch auf jeden Fall die bessere Variante denn in einer Schleife wiederholt Zeichenketten ”addieren” ist furchtbar ineffizient weil da bei jedem Schleifendurchlauf mehr Bytes im Speicher herumkopiert werden. Wobei die erste Zeile von dem was Du da zeigst eigentlich zwei sein sollten. So wie es da steht ist das sehr leicht falsch zu verstehen. Es geht beim Programmieren nicht darum Platz oder Zeilen zu sparen, jedenfalls nicht auf Kosten der Verständlichkeit.

Code: Alles auswählen

text = ['Das', 'ist', 'toll']
out = ''.join(text)
Die Worte durch Leerzeichen zu trennen ist hier natürlich auch durch eine kleine Änderung möglich.
“All tribal myths are true, for a given value of 'true'.” – Terry Pratchett, The Last Continent
Freumel
User
Beiträge: 28
Registriert: Donnerstag 25. Januar 2018, 13:47

Dienstag 29. Januar 2019, 12:21

__blackjack__ hat geschrieben:
Donnerstag 10. Januar 2019, 12:20

Code: Alles auswählen

text = ['Das', 'ist', 'toll']
out = ''.join(text)
Die Worte durch Leerzeichen zu trennen ist hier natürlich auch durch eine kleine Änderung möglich.
Gibt es hier auch eine Möglichkeit das mit Zahlen zu machen?
Das gewünschte Ergebnis ist im wesentlichen gleich geblieben. Habe auch schon eine funktionierende Lösung. Kann mir aber vorstellen, dass es hier wieder eleganter geht :)

Code: Alles auswählen

zahl = [1, 2, 3]
out = ''.join([int(z) for z in zahl])
Benutzeravatar
__blackjack__
User
Beiträge: 2527
Registriert: Samstag 2. Juni 2018, 10:21

Dienstag 29. Januar 2019, 12:39

@Freumel: Du kannst die eckigen Klammern weglassen damit aus der „list comprehension“ ein Generatorausdruck wird und man kann hier `map()` verwenden weil ja nur eine bereits bestehende Funktion auf alle Elemente angewendet werden soll (ich vermute allerdings Du meinstest `str()` statt `int()`):

Code: Alles auswählen

out = ''.join(map(str, zahl))
`zahl` (Einzahl) ist nicht so ein wirklich guter Name für eine Liste mit Zahlen (Mehrzahl). `ziffernwerte` vielleicht‽
“All tribal myths are true, for a given value of 'true'.” – Terry Pratchett, The Last Continent
Antworten