split() Beginner

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
dcea172
User
Beiträge: 5
Registriert: Freitag 10. Februar 2023, 22:42

Hallo zusammen,

ich bin gerade dabei mich in Python einzulernen. Folge da einem Kurs welcher dann auch ein paar Übungen zur Verfügung stellt.
Bei einem soll man aus einer Text Datei die Buchstaben auslesen und zählen. Bisher ging es nur um Wörter, nicht um Buchstaben.

Daher habe ich bisher nur mit dem Paragraphen hier garbeitet.

Code: Alles auswählen

for line in fhand:                          
    line = line.rstrip()
    words = line.split()
Ich gebe zu ich konnte selber nicht auf einen Weg vom Splitten in Wörter zu weiteren Splittung in Buchstaben kommen.
Daher fand ich im Internet folgende Line:

Code: Alles auswählen

chars = [list(line.rstrip()) for line in fhand]
Dies sieht mir doch seehr ähnlich zu dem vorigen aus. Wieso gibt das eine Wörter und das andere die Buchstaben wieder?

Vielen Dank für eure Hilfe und auch Verständnis.
MfG
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@dcea172: Zeichenketten sind iterierbar und liefern die einzelnen Zeichen als Zeichenketten wenn man darüber iteriert. Die Python-Programmierer haben das so implementiert, und dann ist das halt so.

`fhand` ist übrigens ein schlechter Name. Wofür steht das `f`? Und wessen Hand ist hier gemeint? (Ich weiss was diese Abkürzung bedeutet, aber weder sind Abkürzungen eine gute Idee, noch Abkürzungen aus anderen Programmiersprachen übernehmen die in Python keinen Sinn machen.) Das sollte `file` oder `lines` heissen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
dcea172
User
Beiträge: 5
Registriert: Freitag 10. Februar 2023, 22:42

@Blackjack: Danke für deine schnelle Antwort.
fhand hatte ich bisher aus dem Kurs übernommen, war aber auch noch nicht zufrieden damit, werde das anpassen.

Also ich hatte das erste Beispiel wie folgt gelesen:
Für jede Line in der Datei, nimm die Line ohne das letzte Space, teile die Linie auf in durch Space getrennte strings.

Das zweite Beispiel liest sich für mich aber auch:
Mach eine Liste die eine Liste der Line ohne letzte Space und das für jede Line in der Datei enthält

Ich sehe da noch nicht, was den Unterschied macht, wodurch beim 2ten Beispiel keine Wörter gelistet werden.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Dann lies dir noch einmal durch, was du gerade geschrieben hast.
Du hast ja nicht etwa zwei Mal das gleiche geschrieben. Beim zweiten Mal steht nichts von "getrennte" (oder trennen).
dcea172
User
Beiträge: 5
Registriert: Freitag 10. Februar 2023, 22:42

@sparrow: danke auch dir

Ok ich glaube ich habe es jetzt. list() splittet den Text in Charaktere split() nutzt die Space (oder auch andere Trennzeichen) um den Text in jeweile Portionen zu splitten.
Ich hatte das mit der Liste schon komplett vergessen.

Danke euch
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@dcea172: Vielleicht ist es nur ungeschickt ausgedrückt, aber `list()` splittet nichts; `list()` weis gar nicht, dass es sich um Text handelt. `list()` iteriert einfach über das Argument, egal was das ist, und speichert die einzelnen Elemente, die dabei von dem iterierbaren Objekt geliefert werden, in einer Liste. Dass da einzelne Zeichen bei herauskommen, ist die Implementierung des Iterators von Zeichenketten.

Code: Alles auswählen

In [254]: text = "Hallo"

In [255]: list(text)
Out[255]: ['H', 'a', 'l', 'l', 'o']

In [256]: iterator = iter(text)

In [257]: next(iterator)
Out[257]: 'H'

In [258]: next(iterator)
Out[258]: 'a'

In [259]: next(iterator)
Out[259]: 'l'

In [260]: next(iterator)
Out[260]: 'l'

In [261]: next(iterator)
Out[261]: 'o'

In [262]: next(iterator)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
Input In [262], in <cell line: 1>()
----> 1 next(iterator)

StopIteration: 
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
dcea172
User
Beiträge: 5
Registriert: Freitag 10. Februar 2023, 22:42

@blackjack: effektiv, es war falsch ausgedrückt. Ich meinte auch einzeln abspeichern.
Auf jeden Fall hat das den Knoten in meinem Kopf lösen können.
Antworten