ANFÄNGER | Zeichenlänge aller Strings in einer Liste ermitteln

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
clon303
User
Beiträge: 3
Registriert: Donnerstag 17. November 2022, 07:30

Moin,

gerade in Python eingestiegen und arbeite mich an kleineren Aufgaben ab.

Wäre toll wenn ich hier Unterstützung erhalten könnte ;)

Meine erste Frage:
Aufgabe: Zeichelänge (Anzahl der Buchstaben) aller Strings aus einer Liste ermitteln
Ist das noch eleganter als wie folgt machbar?

listea = ['Hauptstadt' , 'Bevölkerungsgröße' , 'Fläche']

x = len(listea[0])
y = len(listea[1])
z = len(listea[2])
print(x + y + z)


Weil, der Versuch mit:

print(len(listea[0:2]))


gibt mir die Anzahl der Elemente (3) aus.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Du solltest vielleicht im Tutorial etwas weiter lesen. Das ist ein Fall für eine Schleife. Schau dir mal for Statements an.
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@clon303: Das ist keine Frage der Eleganz sondern ob das überhaupt richtig ist. Denn das funktioniert ja nur mit Listen die genau drei Zeichenketten enthalten, und so ist die Aufgabe sicher nicht gemeint.

Der Alternativversuch gibt auch nicht 3 aus, sondern 2 (sofern die Liste mindestens 2 Elemente enthält):

Code: Alles auswählen

In [188]: listea = ['Hauptstadt' , 'Bevölkerungsgröße' , 'Fläche']

In [189]: print(len(listea[0:2]))
2
Was hast Du Dir bei dem slicing denn gedacht was das bewirkt?

Code: Alles auswählen

In [190]: listea[0:2]
Out[190]: ['Hauptstadt', 'Bevölkerungsgröße']

In [191]: len(listea[0:2])
Out[191]: 2
`len()` mit einer Liste aufgerufen ergibt immer die Länge der Liste, egal wie die Liste zustande gekommen ist.

Es gibt nicht für alles eine fertige Funktion, man muss die vorhandenen Funktionen und Syntax-Konstrukte entsprechend kombinieren, um Ergebnisse zu bekommen für die es nichts vorgefertigtes gibt. *Das* ist Programmieren. Für diese Aufgabe muss man wissen wie man die Länge einer Zeichenkette ermittelt (`len()`), wie man etwas für jedes Element einer Liste macht, ohne vorher zu wissen wie viele Elemente das sind, und dann wie man die einzelnen Teilergebnisse zu einem Gesamtergebnis zusammenfasst. Am elegantesten wäre hier die Verwendung von den eingebauten Funktionen `map()` und `sum()`:

Code: Alles auswählen

In [192]: print(sum(map(len, listea)))
33
Nicht so elegant aber akzeptabel, insbesondere bei einem Anfänger, wäre eine Schleife über die Elemente in der man das was `map()` und `sum()` machen ausprogrammiert. Und dazwischen läge `sum()` und ein Generatorausdruck oder eine „list comprehension“.

Noch eine Anmerkung zu Namen: Gute Namen sind wichtig. Das ist nicht nur Kosmetik, sondern hilft sehr beim Verständnis von Quelltext, auch demjenigen der den schreibt. Man findet Fehler leichter, auch eigene, wenn man sich Gedanken über passende Namen macht. Namen sollen dem Leser verraten was der Wert im Kontext des Programms bedeutet und weder `listea`, noch `x`, `y`, und `z` tun das.

Einbuchstabige Namen tun das in der Regel sowieso eher selten. Ausnahmen sind so etwas wie `i` und `j` für ganze Zahlen die für Indexzugriffe verwendet werden, und `x`, `y`, und `z` für Koordinaten, weil man das aus der Mathematik gewohnt ist. Aber niemand wird beim Lesen von `x`/`y`/`z` denken „Ah, ja das ist die Länge von einer Zeichenkette“.

Grunddatentypen haben nichts in Namen verloren. Den Typen ändert man gar nicht so selten mal während der Programmentwicklung und dann muss man überall im Programm die betroffenen Namen ändern, oder man hat falsche, irreführende Namen im Quelltext. Ein allgemeiner, besserer Name für `listea` wäre `texts` oder `words`, in einem konkreteren Fall vielleicht auch `headers`, falls es sich im Programm um die Kopfzeile oder Spaltenüberschriften einer Tabelle handelt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
ThomasL
User
Beiträge: 1367
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

__blackjack__ hat geschrieben: Donnerstag 17. November 2022, 09:07 Nicht so elegant aber akzeptabel, insbesondere bei einem Anfänger, wäre eine Schleife über die Elemente in der man das was `map()` und `sum()` machen ausprogrammiert. Und dazwischen läge `sum()` und ein Generatorausdruck oder eine „list comprehension“.
Beispiel für eine for-Schleife:

Code: Alles auswählen

listea = ['Hauptstadt' , 'Bevölkerungsgröße' , 'Fläche']
summe = 0
for element in listea:
    summe += len(element)
print(summe)
Beispiel für eine list-comprehension unter Verwendung der sum() Funktion:

Code: Alles auswählen

listea = ['Hauptstadt' , 'Bevölkerungsgröße' , 'Fläche']
print(sum(len(element) for element in listea))
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
clon303
User
Beiträge: 3
Registriert: Donnerstag 17. November 2022, 07:30

danke für die ganzen schnellen antworten!
gr0ße klasse!
bezugenehmend auf die antworten:
- um sicher zu gehen welcher weg der, momentan (!), richtig ist stellte ich die frage
- schleifen kommen erst noch (und damit quasi keine lösung für die aktuelle frage)
- um eben genau dies - mit vorhanden mitteln (befehlen und funktionen) ziel erreichen - zu bewerkstelligen die frage (sum und map waren noch nicht bestandteil - aber DAS sieht korrekt aus und das werde ich mir genau ansehen! vielen dank!)
- der hinweis mit den namen ist völlig korrekt - in dem moment wo ich irgendwas komplexeres mache als kleine aufgaben zu lösen werde ich das sofort machen!

> es ist ein kleines tutorial und ich will das maximale rausholen und viel nebeher fragen/verstehen ;) habt nachsicht ;)
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@clon303: Ohne Schleifen (oder eben noch ”fortgeschrittenere” Mittel) ist das aber nicht allgemein zu lösen. Die spezielle Variante für drei Elemente bei der man aus irgendwelchen Gründen keine Schleife benutzen kann, würde ich so schreiben:

Code: Alles auswählen

words = ["Hauptstadt", "Bevölkerungsgröße", "Fläche"]
print(len(words[0]) + len(words[1]) + len(words[2]))
Zu den Namen: Das solltest Du *jetzt* schon machen, denn das ist wirklich wichtig, und das muss man üben, damit man das bei den komplexeren Aufgaben schon routiniert kann, und dann nicht zusätzlich zu der Komplexität noch Probleme bekommt, weil man keine guten/passenden Namen verwendet. Wie gesagt ist das nicht nur Kosmetik, weil's schöner aussieht, sondern es hilft beim Verständnis des Quelltextes. Nicht nur anderen Lesern, sondern auch Dir selbst. Wenn man Probleme hat einen passenden Namen zu finden ist das nicht selten ein Hinweis darauf, das man entweder das Problem noch nicht ganz verstanden hat, oder die Lösung die man gerade umsetzt, oder das man Daten in einer unpassenden Art und Weise zusammengefasst hat. In all diesen Fällen ist ein »ich nenn das einfach erst mal `xs_liste` und mache das später ”schön”« keine gute Idee. Man kommt dann irgendwann nicht mehr weiter, oder schreibt unnötig umständlichen und damit fehleranfälligeren Code.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
clon303
User
Beiträge: 3
Registriert: Donnerstag 17. November 2022, 07:30

ah perfekt - DA lag mein fehler und so wäre es zu tun!
vielen dank!
und: jep: name ab sofort selbsterklärend ;)
Antworten