Wie holt man die Zahlen und Zeichen aus einer Python Zeichenkette?
Hallo, ich programmiere ein Taschenrechnerprogramm in python. Nun möchte ich beim ist_gleich Button die Zahlen und die Zeichen aus einem String voneinander trennen.
Beispielcode:
string = "13/5*7"
Die Ausgabe soll eine Liste sein:
string[1] soll 13 sein,
string[2] soll / sein,
string[3] soll 5 sein,
string[4] soll * sein und
string[5] soll 7 sein.
Kann mir bitte jemand helfen? Währe sehr dankbar. Liebe Grüße Alex950
4 Antworten
Hey,
der String an sich ist schon eine liste auch einzelnen Char‘s, das bedeutet du kannst auf jedes Element via dem Indexoperator zugreifen.
string[0] //gibt das erste Zeichen deines Strings aus, 1 das zweite usw.
Ich wenn du tatsächlich alle Zeichen in deinem Taschenrechner aneinanderreihst, kannst du nach jedem operator (hoffentlich sind’s nicht zu viele) zu suchen via find().
plus_position = string.find("+") //gibt dir die position des + Symbols
Alternativ kannst du auch über deinen string interieren, hierfür kannst du die länge bestimmen und danach mit einer for schleife über den string iterieren. Und dabei auf vorhandensein des operator symbols prüfen. Gleichzeitig einen Hilfsstring anlegen welcher die letzten Zeichen speichert, welche du dann jeweils in einen Array packen kannst.
Mit freundlichen Grüßen,
Nico
Ich habe es mit find versucht:
string = "x +++"
find_plus = string.find("+")
Aber ich bekomme nur die possition des ersten plusses. Kann ich irgendwie alle Positionen von den lussen bekommen?
Die Zerlegung einer Zeichenreihenennt man Tokenizing. Probiere mal folgendes:
import tokenize
from io import StringIO
token_list = [t.string for t in tokenize.generate_tokens(StringIO("13/5*7").readline)]
print(token_list)
Das Ergebnis ist:
['13', '/', '5', '*', '7', '', '']
Das ist im wesentlichen das, was du haben willst - wenn man mal von den beiden letzten Listenelementen absieht.
Diese Listenelemente kriegst du weg, wenn du folgendes machst:
import tokenize
from io import StringIO
token_list = [t.string for t in tokenize.generate_tokens(StringIO("13/5*7").readline)]
print(token_list[0 : len(token_list) - 2])
Sieht leider ziemlich kompliziert aus. Eine einfachere Lösung wäre schön.
Danke, sieht wirklich kompliziert aus. Als ich noch wirklicher Anfänger war, habe ich nichtmal den Unterschied zwischen print() und input() verstanden.
Du könntest mit re.split('(\d+)', string) den String string an den Zahlen aufsplitten. Also beispielsweise so...
import re
string = "13/5*7"
print(re.split('(\d+)', string))
Dieser Code liefert als Ausgabe:
['', '13', '/', '5', '*', '7', '']
Wird string dadurch zur Liste? Ah, nevermind. Kann man leicht umwandeln.
Nein, nicht direkt.
Man könnte aber natürlich die so erzeugte Liste der Variablen string zuweisen, wenn man möchte...
import re
string = "13/5*7"
string = re.split('(\d+)', string)
Dann ist string eine Liste mit string[1] == '13' und string[2] == '/' und string[3] == '5' und string[4] == '*' und string[5] == '7'.
Danke, die ersten und die letzten Zeichen kann ich auch wegmachen. Sonst cool.
Die leeren Strings kann man natürlich noch rausfiltern, wenn man möchte. Beispielsweise so...
import re
string = "13/5*7"
string = re.split('(\d+)', string)
string = [s for s in string if s]
Beachte jedoch, dass dann '13' nicht mehr string[1] ist, sondern string[0]. Das würde dann, genau genommen, nicht mehr deiner Fragestellung entsprechen.
„string[1] soll 13 sein“
============
Wenn man möchte, kann man dann auch noch die Zahlen gleich als Integer (Ganzzahl) in die Liste schreiben, statt als String. Beispielsweise so...
import re
string = "13/5*7"
string = re.split('(\d+)', string)
string = [int(s) if s.isdigit() else s for s in string if s]
Oh, ich habe mich "verdacht"... Eigentlich sollte es einfach das erste sein, aber ob 1 oder 0, das ist das gleiche... Aber ich hätte die überflüssigen Lücken mit dem Code:
string = string[1:-1]
rausfiltern. Finde das halt einfacher... Aber danke.
Okay, habe für dich nachgebessert:
l = list(input())
for i in range(1,len(l)-1):
if(i >= len(l)):
break
if l[i].isnumeric() and l[i-1].isnumeric():
l[i-1] += l[i]
l.pop(i)
print(l)
Sollte der String schon vorliegen, dann in der ersten Zeile
input()
durch die Stringvariable ersetzen.
...............
Die Eingabe
13*5/7
führt zur Ausgabe
['13', '*', '5', '/', '7']
Diese Lösung gefällt mir sogar besser als das, was ich selbst zu dieser Frage geschrieben habe.
Danke, aber bekomme ich auch bei anderen Aufgaben wie 1/5*55 soeine Lösung? Irgendwie sieht es aus, als wäre die Lösung nur für diese Aufgabe gedacht.
Mein Lösungsvorschlag ist universell einsetzbar.
Die Eingabe
1/5*55
führt zur Ausgabe
['1', '/', '5', '*', '5', '5']
Allerdings würde ich empfehlen, die Variante von mihisu zu nehmen. Mit regular Expressions zu arbeiten, ist da durchaus sinnvoller und performanter. Meine Variante funktioniert zwar ebenfalls, allerdings ist das Rumwerkeln an Listen nicht gerade effizient.
Aber du brauchst auch garnicht die länge des Strings bestimmen, es sollte auch mit
gehen