Integer in Variable

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
Lausemausiii
User
Beiträge: 18
Registriert: Sonntag 17. November 2019, 18:52

Hallo zusammen,

ich möchte eine Variable in eine Variable einbauen. Ist dies möglich?

Beispiel:

Code: Alles auswählen

x=5
test(x)_id1 #Funktioniert nicht
Als Ergebnis wünsche ich mit '5'.
Mit

Code: Alles auswählen

'test{}_id1'.format(x) 
erscheint mir nur der String test5_id1

Danke!!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dafür benutzt man Wörterbücher. Da kannst du Schlüssel generieren.
Benutzeravatar
sparrow
User
Beiträge: 4198
Registriert: Freitag 17. April 2009, 10:28

Oder man sollte grundsätzlich die eingesetzte Datenstruktur überdenken. Generierte Variablennamen deuten oft darauf hin, dass Daten unabhängig voneinander vorgehalten werden, die eigentlich zusammen gehören.
Lausemausiii
User
Beiträge: 18
Registriert: Sonntag 17. November 2019, 18:52

Mein Ziel ist es in diesem Fall aber ein unabhängiges Programm zu schreiben. Danke :)
Benutzeravatar
sparrow
User
Beiträge: 4198
Registriert: Freitag 17. April 2009, 10:28

Wann ist ein Programm denn abhängig und wann ist es unabhängig? Und warum muss man für ein unabhängiges Programm Variablennamen generieren?
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Lausemausiii: Den letzten Beitrag verstehe ich nicht. Was ist denn in diesem Fall ein „unabhängiges Programm“? Eines mit schlechten/falschen Datenstrukturen? Nummerierte Namen sind an sich schon ein Warnzeichen. Wenn man dann noch den Wunsch verspürt solche Namen dynamisch generieren zu wollen oder dynamisch darauf zuzugreifen, dann macht man etwas falsch und sollte dringend über eine geeignete Datenstruktur nachdenken.

Und wenn die am Ende aus tief verschachtelten Grunddatentypen besteht, sollte man auch über eigene Datentypen nachdenken, damit man das Programm am Ende noch verstehen/nachvollziehen kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Lausemausiii hat geschrieben: Donnerstag 28. November 2019, 10:06 Mein Ziel ist es in diesem Fall aber ein unabhängiges Programm zu schreiben. Danke :)
Das verstehe ich genauso wenig wie meine Vorredner ;)

Es waere gut wenn du ein bisschen weiter ausholst, was du da genau erreichen willst.

Die Frage nach generierten Variablennamen taucht ja gelegentlich mal auf. Sofern man nicht gleich auch den mit diesen Variablen arbeitenden Code generiert, macht das keinen Sinn. Denn entweder schreibst du Code, der eine Variable gen_127_465 kennt, oder du musst den generisch auslegen so dass er eben mit Datenstrukturen wie Listen oder Woerterbuechern arbeitet, um ueberhaupt zu erfahren, welche Daten zur Verfuegung stehen.
Lausemausiii
User
Beiträge: 18
Registriert: Sonntag 17. November 2019, 18:52

Entschuldigung, ich dachte eine ausführliche Erklärung ist nicht notwendig. Da ich aber leider falsch verstanden wurde hier mein Problem.

Über eine manuelle Eingabe werden Werte eingegeben, diese speicher ich in Variablen ab.
Mit diesen Variablen möchte ich eine Liste erstellen um anschließend diese Liste in verschiedene Schleifen zu verwenden.
Mit unabhängig meinte ich, dass ich zu Beginn ja nur zwei Werte eingeben kann oder beispielsweise fünf. Mit den generierten Variablennamen wollte ich das erreichen um eine Liste erstellen zukönnen die dynamisch ist.

Leider bin ich noch ziemlich am Anfang meiner 'Programmierkarriere', deshalb verwende ich manchmal vielleicht die falschen Begriffe, sorry.
Ich hoffe ich habe es nun deutlich gemacht und man versteht meine Denkweise für mein Programm.
Benutzeravatar
sparrow
User
Beiträge: 4198
Registriert: Freitag 17. April 2009, 10:28

Dafür brauchst du aber keine Variablennamen generieren oder Variablen nummerieren. Wie du schon selbst sagst: Dafür braucht es eine Liste.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

wieso nicht direkt in einer Liste speichern? So kann die Liste beliebig viele Elemente beinhalten, wenn du fertig bist gibst du einfach "q" ein.

Code: Alles auswählen

eingaben = []
while True:
    eingabe = input("Manuelle Eingabe, zum abbrechen 'q' eingeben: ")
    if eingabe == "q":
        break
    else:
        eingaben.append(eingabe)
    

print(eingaben)
Lausemausiii
User
Beiträge: 18
Registriert: Sonntag 17. November 2019, 18:52

Ich stelle aber eine Matrix auf mit 2 Werten für eine Linie und 1 Wert für einen Punkt.

[Linie1_id1, Linie1_id2,Punkt1_id3,
Linie2_id1,Linie2_id2,Punkt2_id3, ....]

Für mein weiteres Skript ist diese Einteilung und Bennenung leider erforderlich.
Benutzeravatar
sparrow
User
Beiträge: 4198
Registriert: Freitag 17. April 2009, 10:28

Die Benennung kann nicht erforderlich sein, weil die Werte in einer Liste (und du zeigst hier eine Liste) nicht an Namen gebunden sind.

Ich empfehle dir, dein Problem komplett zu zeigen. Denn etwas ist kaputt. Wir können dir zeigen, wie es richtig funktioniert - aber nur wenn wir wissen worum es geht.
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist doch egal, wie die Datenstruktur aussieht, die Antwort ist immer die selbe, erstelle eine Liste:

Code: Alles auswählen

from itertools import count
eingaben = []
for idx in count(1):
    id1 = input(f"Linie {idx}/ID1:")
    id2 = input(f"Linie {idx}/ID2:")
    id3 = input(f"Punkt {idx}/ID3:")
    eingaben.append((id1, id2, id3))
wobei es hier bald Sinn machen würde, statt des Tuples eine eigene Klasse zu erzeugen. Wenn das nachfolgende Programm mit dieser Art Liste nicht umgehen kann, dann muß man es dort auch reparieren.
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Lausemausiii: Diese Einteilung und Benennung ist nur erforderlich wenn Du sie erforderlich machst, und genau das solltest Du eben nicht.

Die Struktur ist noch nicht passend, denn da gehören ja jeweils drei IDs zusammen, also sollten die auch zusammengefasst werden, beispielsweise in einem Tupel. Und damit ergeben sich dann alle Zahlen in den Namen aus der Position in der jeweiligen Teildatenstruktur und sind somit überflüssig!

[(Linie1_id1, Linie1_id2,Punkt1_id3), (Linie2_id1,Linie2_id2,Punkt2_id3), ...]

Und hier sollten halt auch nie diese Namen im Programm stehen, sondern gleich die Werte. Also beispielsweise:

[(42, 23, 4711), (23, 90210, 7), ...]

Und hier greift dann mein Kommentar bezüglich eigenen Datentypen eventuell schon damit nicht mit vielen verschiedenen Strukturen endet bei denen man sich merken muss was an welchem Index steht. Zum Beispiel über `collections.namedtuple()` aus der Standardbibliothek oder das externe `attr`-Modul.

Code: Alles auswählen

In [25]: from collections import namedtuple                                     

In [26]: LineData = namedtuple('LineData', 'line_id_a line_id_b point_id')      

In [27]: lines = list(map(LineData._make, [(42, 23, 4711), (23, 90210, 7)]))    

In [28]: lines                                                                  
Out[28]: 
[LineData(line_id_a=42, line_id_b=23, point_id=4711),
 LineData(line_id_a=23, line_id_b=90210, point_id=7)]

In [29]: lines[0]                                                               
Out[29]: LineData(line_id_a=42, line_id_b=23, point_id=4711)

In [30]: line = lines[0]                                                        

In [31]: line.point_id                                                          
Out[31]: 4711

In [32]: line.line_id_a                                                         
Out[32]: 42

In [33]: line.line_id_b                                                         
Out[33]: 23
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten