Wie verwandelt man Python Listen in Variablen?

2 Antworten

>>> l=['a','b','c']
>>> x,y,z=l
>>> x
'a'
>>> y
'b'
>>> z
'c'

Ein Unpacking wäre eine Möglichkeit, wenn die Länge fest ist.

Alex950130 
Fragesteller
 22.06.2022, 07:57

Das ist das größte Problem. Es sind Nutzereingaben und die Lqnge ist deswegen nicht fest.

0
KarlRanseierIII  22.06.2022, 12:53
@Alex950130

Dann ergibt es doch wenig Sinn die Objekte aus dem Container zu nehmen und ihnen einzelne NAamen (nach welchem Muster eigentlich?) zuzuweisen.

Du müßtest dann ja auch wissen welche Namen erzeugt wurden, wenn Du die Objekte später wieder nutzen möchtest.

0
Alex950130 
Fragesteller
 22.06.2022, 13:55
@KarlRanseierIII

Das Muster soll ganz einfach der Name mit einer 1, dann 2,anschließend 3,... sein.

0
Alex950130 
Fragesteller
 22.06.2022, 13:56
@Alex950130

Der einzige Sinn ist halt dass ich mit eval die Sachen dann ausechnen kann. Sonst kommt der fehler das eval nur strings und noch was "scanen" kann.

0
KarlRanseierIII  22.06.2022, 14:06
@Alex950130

Was aber immernoch Blödsinn ist, weil Du diese Namen ja zur spätere Nutzung allesamt kennen müßtest.

Das hört sich alles nach schwerwiegendem Entwurfsfehler an.

Da ich jetzt die Antworten bei regex gelesen habe:

"".join(list)

erzeugt Dir einen String der aus allen konkatenierten Listenelementen besteht - man kann das natürlich auch manuell in einer Schleife erleidgen:

>>> l=['32','+','24','*','2']
>>> "".join(l)
'32+24*2'
>>> eval("".join(l))
80
>>> s=""   # manuelle Variante
>>> for item in l:
...   s+=item
...
>>> s
'32+24*2'
>>> eval(s)
80
0
Alex950130 
Fragesteller
 22.06.2022, 17:54
@KarlRanseierIII

Wahrscheinlich wäre ich selber auch drauf gekommen. Aber trotzdem danke. Wieso ich diese Lösung nicht machen kann:

Ich habe eine Liste aus der Variable ersellt, da ich dachte, es wäre dann leichter... 😂. Immer noch bleibt mir aber diese eine Frage, wie kann ich bestimmte Nullen wegmachen?

07+3044

Die erste Null soll entfernt werden, denn man stoßt aus einen Syntaxfehler mit eval().

0
KarlRanseierIII  22.06.2022, 23:36
@Alex950130

Hier käme wieder die List eins Spiel, dann könntest Du mit lstrip arbeiten, exemplarisch:

 "007".lstrip('0')
'7'
0
Alex950130 
Fragesteller
 23.06.2022, 20:50
@KarlRanseierIII

Und wieso genau kommt ein falsches Ergebnis bei soeinem String?

string = "0*5+06"

string = string.lstrip("0")

print(string)

Ausgabe = "*5+06"

0
KarlRanseierIII  23.06.2022, 22:34
@Alex950130

weil l(eft)strip eben nunmal vom Anfang eines Strings abstreift (entfernt). Du kannst Dir ja überlegen, wie Du den Sonderfall 0+ handhaben willst.

Ich hatte doch in der anderen Frage explizit darauf hingewiesen, daß eval ausschließlich Ausdrücke verarbeitet, die Python selbst auch verstehen würde.

Übrigens kannst Du auch nicht Literale mit Führungsnull casten.

Vielleicht wäre es sinnvoller anstatt zu strippen, die Eingaben zum Eingabezeitpunkt zu prüfen und gff. zu bereinigen.

0
Alex950130 
Fragesteller
 24.06.2022, 22:11
@KarlRanseierIII

Null mal fünf plus sechs sollte python aber schon verstehen... Halt nicht *5+06. Deswegen habe ich es anders hinbekommen. Bereinigen würde ich gerne auch selber, aber wie? Ich habe 'ne halbe Stunde lang eine 20 Zeilen lange funktion erstellt, die immernoch alle Nullen wegmacht. Obwohl man das auch mit einer Zeile schafft:

string.replace(0, "")

0
KarlRanseierIII  24.06.2022, 22:20
@Alex950130

Das lstrip() war auch eher unter der Annahme gedacht, daß Du die einzelnen Zahlen getrennt verarbeitest. Du willst ja nun keine innenliegenden 0en eleminieren.

Ich weiß natürlich zu wenig über den Gesamtkontext, aber grundlegend würde ich ja behaupoten wollen, steht am Anfang (einer Zahl) eine 0, so muß ein Operator oder ein Dezimalpunkt folgen - andernfalls sollte die Eingabe verworfen werden.

0
Alex950130 
Fragesteller
 25.06.2022, 07:36
@KarlRanseierIII

Ne, ich will halt nur die überflüssigen Nullen entfernen.

Aber programmieren könte ich, das keine Zahl folgen darf, wenn am Anfng eine Null ist, doch soll ich jetzt den Satz "Ein Operator darf nicht ach einer Null folgen"?

Eigentlich darf er das ja.

0
KarlRanseierIII  25.06.2022, 13:23
@Alex950130

Es darf nur ein Operator folgen, oder eien Dezimalpunkt. 0+ 0* usw. oder eben 0.xyz. (Oder eben Komma, wenns lokalisiert sein soll.)

Kann man Klammern respektive Zahlen mit Vorzeichen eingeben, müßtest DU noch die Variante mit - davor berücksichtigen.

0
Alex950130 
Fragesteller
 25.06.2022, 17:56
@KarlRanseierIII

Ganau, meinte "eine Zahl darf nicht nach einer Null am Anfang einer Zahl folgen".

Wann ganau muss ich die Variante berücksichtigen? 3+-3 kann man ihne problem eingeben...

0
KarlRanseierIII  25.06.2022, 23:05
@Alex950130

Naja, bei Deienr 'Bereinigung mußt Du eben darauf achten, daß - als Teil der Zahl vor der 0 noch legitim ist.

Die Frage ist also ob sowas wie x+-0.xyz als legitime Eingabe zu sehen ist. eval() frißt das definitiv.

0

Das ist keine Liste, sondern ein Tupel, was du da hast.

Auf die einzelnen Elemente kannst du via Indexer zugreifen:

letters = "a", "b", "c"
element_1 = letters[0]
element_2 = letters[1]
element_3 = letters[2]

Die Zählung beginnt stets bei 0.

Alex950130 
Fragesteller
 22.06.2022, 07:56

Eigentlich meinte ich Listen. So geht's aber auch. Aber ich suche diese Funktion, denn ich habe Nutzerdaten. Die Länge der Nutzereingabe kann ich natürlich durch "len(Liste)" herausfinden, aber dann müsste ich unendlich viel if...: Abschnitte aufschreiben. Diese Funktion soll mir das halt leichter machen.

0
regex9  22.06.2022, 11:23
@Alex950130

Bei einer Liste:

letters = [ "a", "b", "c" ]

hast du ebenso via Indexer Zugriff auf die einzelnen Elemente.

element_1 = letters[0]

Lass die Werte doch einfach in der Liste stehen. Sie sind doch alle zugreifbar und darauf kommt es an. Wenn es um die Assoziation zu einem anderem Key (statt einem Index) geht, wäre ein dict die bessere Speicherquelle.

some_map = {}
some_map["some_key"] = "some value"
some_map["some_other_key"] = "some other value"
print(some_map["some_key"]) # "some value"

Im besten Fall werden die Werte von Anfang an darin gespeichert. Wenn der Umweg mit der Liste notwendig ist, könnte man auch ummappen:

keys = [ "some_key", "some_other_key" ]
values = [ "some value", "some other value" ]
some_map = {}

for index, key in enumerate(keys):
  some_map[key] = values[index]
0
Alex950130 
Fragesteller
 22.06.2022, 13:50
@regex9

Danke. Das ganze war notwendig, da ich eine durch Nutzer eingegebene Rechnung habe. Diese möchte ich ausrechnen, und dann ausgeben. Nun habe ich eiine Methonde gefunden (eval()), und möchte diese anwenden. Ich dachte zuers, das ich das nur so machen kann:

Liste = ["5", "+", "6"]

eval(Liste[0] + Liste[1] + Liste[2])

Dann habe ich gefragt, wie ich alles in Variablen bekomme (Diese Frage). Und danach herausgefunden, dass es auch so geht:

Variable = "5+6"

eval(Variable)

Sorry deswegen. LB Alex

0
regex9  22.06.2022, 14:21
@Alex950130

Mit eval kannst du ziemlich schnell auf Probleme stoßen. Wenn die Eingabe inkorrekt ist, führt dies zu einem Laufzeitfehler und eine Validation ist nicht gerade einfach. Das heißt, ein try-except wäre mindestens angebracht. Bezogen auf die Auswertung wird mit eval ein eigener Python-Kontext gestartet.

Bei einfachen Rechnungen (z.B. mit nur zwei Operanden oder mehreren Operanden und gleichrangigen Operatoren) wäre es besser, die Eingaben zu trennen.

Beispiel:

summand1 = int(input())
summand2 = int(input())
operator = input()

if operator == "+":
  sum = summand1 + summand2
0
Alex950130 
Fragesteller
 22.06.2022, 17:48
@regex9

Das ist halt bei meinem Taschenrechner so, das der Nutzer mir die Sachen eingaben soll... ich weß jetzt nicht ob die Rechnung "55+6" oder "54*523/2345+23" ist. Deswegen habe ich nur einen input. Dann habe ich es noch so gestaltet, dass es eine Variable ist, und der Benutzer kann nur die Zeichen in Mathe, die es gibt eintippen. Ich habe sehr viel auch so abgesichert, das ich zum Beispiel keine 2 Zeichen hintereinander haben kann. Wahrscheinlich werde ich jetzt noch eine Frage stellen, und dann fragen, wie ich die bestimmten Nullen wegmachen kann:

05+80=?

Bei eval kommt ein Syntaxfehler wegen der Null vorne dran.

0