String teilen

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
huhu002
User
Beiträge: 3
Registriert: Mittwoch 18. Mai 2011, 09:05

Hallo!

Habe eine Frage: Wie kann ich in Python einen String, welcher aus 5 mal 5 Ziffern mit einem + als Trennzeichen besteht, teilen? Also z.b. 12345+12345+usw. teilen, dass ich dann eben 5 mal den Wert (12345) habe?
Komme von C, da geht das mehr oder weniger einfach mit strtok() :wink:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Das ist in Python ein ganzes Stück einfacher als in C:

Code: Alles auswählen

>>> "12+34+56+78+90".split("+")
['12', '34', '56', '78', '90']
Hast du vor, solche Ausdrücke, bzw. komplexere, zu parsen? Dann solltest du die Suchfunktion des Forums benutzen, dort gibt es eine ganze Menge Hinweise dazu.

Sebastian
Das Leben ist wie ein Tennisball.
huhu002
User
Beiträge: 3
Registriert: Mittwoch 18. Mai 2011, 09:05

Nein, muss sie nur teilen.

Und wenn ich jetzt die Zahlen nur ausgeben möchte, wenn sie ungleich 0 sind, kann ich die einzelnen Teile dann einfach mit if != 0 ansprechen, oder muss ich zuvor noch was umwandeln?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wenn es sich um Zahlen handelt, dann solltest du die Strings auch in Zahlen umwandeln. Wenn du damit Schwierigkeiten hast, dann solltest du das Tutorial durcharbeiten.
Das Leben ist wie ein Tennisball.
Benutzeravatar
sparrow
User
Beiträge: 4198
Registriert: Freitag 17. April 2009, 10:28

Wenn du die Zahlen aber nicht als "Zahlen" brauchst sondern dir Zeichenketten reichen geht das natürlich auch:

Code: Alles auswählen

>>> a = "12+34+0+56+78+0+90"
>>> for part in a.split("+"):
	if part is not "0":
		print part

		
12
34
56
78
90
>>> 
BlackJack

@sparrow: Das ist keine gute Idee denn ``is``/``is not`` testet nicht auf Wertegleichheit sondern auf Objektidentität. Und zwei Zeichenketten mit dem gleichen Wert müssen nicht auch das selbe Objekt sein:

Code: Alles auswählen

In [177]: a = "Hallo Welt"

In [178]: b = "Hallo Welt"

In [179]: a is b
Out[179]: False

In [180]: a == b
Out[180]: True
Dein Code funktioniert also nur *zufällig* richtig.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Eingedampft (mit einigermaßen aktuellem Python 2):

Code: Alles auswählen

from __future__ import print_function
map(print, (int(part) for part in '12+3456+000+78+90'.split('+') if int(part)))
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wie /me eigentlich eindampfen wollte ;-)

Code: Alles auswählen

filter(bool, map(int, "12+34+56+78+90".split("+")))
Ein `map` mit Nebeneffekte ist auch eher ungewöhnlich und sollte vermieden werden.
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

EyDu hat geschrieben:Ein `map` mit Nebeneffekte ist auch eher ungewöhnlich und sollte vermieden werden.
Ich hab ja nicht gesagt, dass mein Code schön ist. ;-) Aber sicherheitshalber: Kids, don't do this at home!
huhu002
User
Beiträge: 3
Registriert: Mittwoch 18. Mai 2011, 09:05

danke erstmals.
eine Frage hätte ich aber noch: da in meinem String mehrere (teilweise unterschiedliche) Trennzeichen (+ und #) enthalten sind, bräuchte ich sozusagen was, um mehrere Trennzeichen "herauszufiltern".
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

huhu002 hat geschrieben:danke erstmals.
eine Frage hätte ich aber noch: da in meinem String mehrere (teilweise unterschiedliche) Trennzeichen (+ und #) enthalten sind, bräuchte ich sozusagen was, um mehrere Trennzeichen "herauszufiltern".
Verrate uns doch mal das komplette Szenario. So langsam hat man den Eindruck, dass Du immer mehr "enthüllst" und das im Endeffekt besser auf Regular Expressions hinauslaufen wird.

Also: Wo kommen diese Daten her? Was hast Du damit vor? Welche Fälle können auftreten?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ja, Hyperion hat recht, der OP sollte mal sagen was er eigentlich will. Scheint nämlich auf ``re.split`` hinauszulaufen...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten