Seite 1 von 1

Schleifen - Anfängerfrage

Verfasst: Donnerstag 10. Januar 2019, 01:45
von Freumel
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

Re: Schleifen - Anfängerfrage

Verfasst: Donnerstag 10. Januar 2019, 07:13
von ThomasL
ersteres geht auch so:
b = list(map(lambda x:x*2, fac))

und letzteres einfach so:
b = sum(fac)

Re: Schleifen - Anfängerfrage

Verfasst: Donnerstag 10. Januar 2019, 08:16
von __blackjack__
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)

Re: Schleifen - Anfängerfrage

Verfasst: Donnerstag 10. Januar 2019, 08:28
von sparrow
@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.

Re: Schleifen - Anfängerfrage

Verfasst: Donnerstag 10. Januar 2019, 12:14
von Freumel
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)

Re: Schleifen - Anfängerfrage

Verfasst: Donnerstag 10. Januar 2019, 12:20
von __blackjack__
@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.

Re: Schleifen - Anfängerfrage

Verfasst: Dienstag 29. Januar 2019, 12:21
von Freumel
__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])

Re: Schleifen - Anfängerfrage

Verfasst: Dienstag 29. Januar 2019, 12:39
von __blackjack__
@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‽