Seite 1 von 1
Counter in Variablennamen verwenden
Verfasst: Mittwoch 8. Januar 2020, 14:03
von j0nas_
Hallo zusammen,
ich habe bisher alle meine Pythonprobleme durch recherchieren in verschiedenen Foren lösen können. Nun habe ich ein vermeidlich einfaches Problem, welches sich leider noch nicht lösen lässt. Jedenfalls geht es darum, dass ich einen "counter" definiere und zu jedem dieser counter eine Variable definiere, in dessen Namen der besagte counter vorkommen soll. Wie ich es auch probiert habe, kam es immer zu einer Fehlermeldung.
Mein Problem auf das wesentliche reduziert lässt sich wie folgt darstellen:
...
list = [5, 2, 4, ...]
counter = 1
'element_' + [counter] = list[counter] # soll also element_1 = 5 ergeben
counter = counter + 1
'element_' + [counter] = list[counter]
...
Ich hoffe, dieses Problem lässt sich durch einen einfachen Befehl lösen und wäre sehr dankbar, wenn mir hierbei jemand helfen könnte.
Vielen Dank vorab und einen schönen Tag euch allen

Re: Counter in Variablennamen verwenden
Verfasst: Mittwoch 8. Januar 2020, 15:11
von Sirius3
Man sollte keine dynamischen Variablennamen benutzen, das macht nur mehr Probleme, als dass es löst. In Deinem Fall würde ich einfach eine Liste verwenden.
Re: Counter in Variablennamen verwenden
Verfasst: Mittwoch 8. Januar 2020, 15:17
von __blackjack__
Die Liste sollte man übrigens nicht `list` nennen, denn das verdeckt dann den eingebauten `list`-Typ, der ja auch als Funktion verwendet oft sinnvoll ist. Grunddatentypen sollten auch nicht als Bestandteil von Namen auftauchen, weil man den Typ nicht selten im Laufe der Entwicklung auch mal ändert, und dann hat man entweder falsche, irreführende Namen im Programm, oder man muss überall alle betroffenen Namen anpassen.
Re: Counter in Variablennamen verwenden
Verfasst: Mittwoch 8. Januar 2020, 15:24
von j0nas_
Hallo und danke für eure Antworten,
einfach eine Liste verwenden ist schwierig, weil ich in meinem tatsächlichen Probem ein Excelfile einlese und jeder Spalteneintrag später zu einem Attribut ein Klasse wird.
Ist es also unmöglich den counter wie von mir gewollt in den Namen der Variablen zu verwenden? Auch unter Verwendung von beispielsweise enumerate? Oder kann ich sonst irgendwie die Elemente (nicht manuell) hochzählen?
Viele Grüße,
Jonas
Re: Counter in Variablennamen verwenden
Verfasst: Mittwoch 8. Januar 2020, 15:26
von sparrow
Im Gegebenen Beispiel sind die zuzuweisenden Werte vor allem schon in einer Liste, was das ganze etwas unsinnig macht.
Vielleicht solltest du etwas weiter ausholen, was du eigentlich tun möchtest. Um mal bildlich zu sprechen: Manchmal kennt man das Ziel, aber der vermeidliche Weg ist nicht der, den man zu sehen denkt.
Also sag uns mal das Ziel und den Grund, dann sagen wir den richtigen Weg.
Variablen zu nummerieren ist möglich - aber auf jeden Fall falsch bis unsinnig.
Re: Counter in Variablennamen verwenden
Verfasst: Mittwoch 8. Januar 2020, 15:27
von Sirius3
Was haben durchnummerierte Variablen mit Attributen einer Klasse zu tun? Ob Du element[1] schreibst oder element_1 ist vom Schreiben her egal, das erstere aber viel sauberer.
Vielleicht kannst Du Deine Aufgabe genauer beschreiben?
Re: Counter in Variablennamen verwenden
Verfasst: Mittwoch 8. Januar 2020, 15:48
von j0nas_
Also dann beschreibe ich mal genauer, was mein Problem ist:
Ich habe eine Exceldatei die im Endeffekt relativ viele Einträge hat. Jede Zeile stellt also ein Klassenobjekt dar, wobei jeder Spalteneintrag das entsprechende Klassenattribut ist. Also habe ich zunächst die entsprechende Klasse definiert. (nachfolgend als "class_zeile" aufgeführt)
Nun habe die besagte Exceldatei in Python eingelesen und einen "counter" manuell wie folgt eingeführt um nacheinander einzele Zeilen des Excelfiles (= einzele Objekte) zu betrachten und anschließend deren Attribute zu bestimmen.
counter = 0
while counter <= 100:
Zeile_des_Excelfiles = tabel.loc[counter].values
attribut_1= Zeile_des_Excelfiles[0]
attribut_2= Zeile_des_Excelfiles[1]
Nun kommen wir zu meiner ursprünglichen Frage: ich möchte nicht von Hand jedes einzelne Objekt (Zeile des Excelfiles) durchnummerieren müssen. Genau das habe ich jedoch bisher wie folgt gemacht:
if counter == 0:
element_0 = class_zeile(attribut_1, attribut_2)
elif counter == 1:
element_1 = class_zeile(attribut_1, attribut_2)
.....
counter = counter + 1
Ich hoffe mein Probem ist damit etwas klarer geworden.
Vielen Dank schon mal für weitere Hilfestellungen.
Re: Counter in Variablennamen verwenden
Verfasst: Mittwoch 8. Januar 2020, 15:52
von __deets__
Die Loesung ist immer noch eine Datenstruktur. Wenn wir bei deinem Beispiel bleiben:
Code: Alles auswählen
attribute = [Zeile_des_Excelfiles[i] for i in range(2)]
for element in attribute:
...
Wenn du von Hand Indizes hochzaehlst, machst du was falsch. Und wenn du abhaengig von einem Counter wieder n Variablen anlegst, dann willst du auch wieder eine Liste haben.
Re: Counter in Variablennamen verwenden
Verfasst: Mittwoch 8. Januar 2020, 16:13
von Sirius3
Was letzlich bei Dir rauskommt, ist eine Liste von Excelzeilen (bzw. für jede Zeile eine Instanz Deiner Klasse). Und die beste Form, das im Speicher zu halten ist eine Liste.
Und wie es scheint, scheinst Du schon pandas zu benutzen. Das hat eine Methode um die Zeilen durchzulaufen, eine while-Schleife ist das falsche Konstrukt. Die Spalten haben hoffentlich schon bessere Namen als Attribut1, etc.
`class_zeile` hat hoffentlich auch einen besseren Namen. Da ich den Inhalt nicht kenne, nenne ich sie einfach mal `Dataset`:
Was übrig bleibt, ist das:
Code: Alles auswählen
datasets = []
for row in tabel.itertuples():
datasets.append(DataSet(row.spalte_a, row.spalte_b))
bzw. in Kurzschreibweise:
Code: Alles auswählen
datasets = [DataSet(row.spalte_a, row.spalte_b) for row in tabel.itertuples()]
Re: Counter in Variablennamen verwenden
Verfasst: Mittwoch 8. Januar 2020, 16:28
von j0nas_
Ich verstehe ehrlich gesagt nicht ganz, wie mich das weiter bringt. Ich hätte somit die Einträge aus Excel in einer Liste. Nicht jedoch als Klassenobjekte.
Das Ziel wäre es jedoch im späteren Verlauf in der Art
c = element_0.attribut..
darauf zuzugreifen.
Re: Counter in Variablennamen verwenden
Verfasst: Mittwoch 8. Januar 2020, 16:53
von sparrow
Das Ergebnis ist eine Liste, deren Elemente die einzelnen "class_zeile" (was auch immer das sein soll) Instanzen sind. Er nennt sie nur DataSet, was wahrscheinlich der passendere Name ist.
Also genau das, was du suchst.
Re: Counter in Variablennamen verwenden
Verfasst: Mittwoch 8. Januar 2020, 16:58
von Sirius3
Der Zugriff erfolgt, wie ich schon oben geschrieben habe, statt über die Nummer am Variablennamen über die Nummer in Eckigen Klammern:
Obwohl hoffentlich nirgends direkt mit einer Zahl darauf zugegriffen wird, sondern das wieder in irgendwelchen Schleifen:
Re: Counter in Variablennamen verwenden
Verfasst: Mittwoch 8. Januar 2020, 20:52
von j0nas_
Danke für deine ausführliche Antwort.
Aber nun ist es so, dass es nur in Listenform habe - somit bekomme ich die einzelnen Einträge also nicht als einzelne Klassenobjekte? Oder gäbe es eine Möglichkeit?
Re: Counter in Variablennamen verwenden
Verfasst: Mittwoch 8. Januar 2020, 20:57
von __deets__
mein_objekt oder liste_von_objekten[index] oder for Ding in liste ist alles das gleiche. Du hast damit das Objekt in der Hand. Probier es doch mal aus.
Re: Counter in Variablennamen verwenden
Verfasst: Mittwoch 8. Januar 2020, 21:11
von j0nas_
Ich werde mir die Sache morgen nochmal etwas in Ruhe anschauen. Wie ich "liste_von_objekten[index]" verwende, ist mir prinzipiell schon klar. Ich dachte nur, dass es dann im für viele Einträge und viele Attribute am Ende übersichtlicher wäre, mit Klassen zu arbeiten. Ich würde dafür dann gerne mal beide Methoden ausprobieren. Nun weiß ich leider immer noch nicht, wie ich (zumindest für die besagten Versuchszwecke) den Counter im Variablennamennamen verwenden kann. Ich denke es wäre schon sinnvoll, dass ich somit dann selbst zur Einsicht kommen würde, warum es so weniger sinnvoll ist.
Re: Counter in Variablennamen verwenden
Verfasst: Mittwoch 8. Januar 2020, 21:17
von Sirius3
Was der Typ der Listenelemente oder der Objekte ist, die Du an nummerierte Variablen bindest, spielt doch überhaupt keine Rolle. Es kommt nur darauf an, in welcher Struktur Du diese Objekte speicherst. Schreibe und Poste doch mal konkreten Code, der auch funktioniert, dann wirst Du sehen, dass es keinen Unterschied mcht.