@XIII: globale Variablen werden nicht dadurch besser, dass man sie in ein klassenartiges Objekt `GlobaleVariablen` packt.
Generell sollte man keine Listen in irgendeiner Funktion verändern, wie Du ja selbst bemerkt hast. Funktionen sollten in sich abgeschlossene Einheiten sein, die alles was sie brauchen über ihre Argumente bekommen, und das Ergebnis per `return` zurückliefern, ohne sonstige Seiteneffekte, bedeutet, nichts an den übergebenen Argumenten verändern.
Nach Konvention werden Funktionsnamen und Variablennamen klein_mit_unterstrich geschrieben. Funktionen sollten nach Tätigkeiten benannt werden `Zusammensetzungsliste` ist aber keine.
` remove` ist ein ziemlich umständlicher Weg, um ein Element zu löschen, wenn man dessen Index schon kennt (`del Spalteninhalt[0]`), aber wie schon geschrieben, macht man das nicht. `i` ist ein schlechter Name für einen Cocktail und auch nicht für einen ` Getraenkeanschluss`.
`Zutaten` wird mit einer leeren Liste initialisiert, die aber dann zu einem IndexError führt, falls der Getränkenamen nicht existiert. In diesem Fall sollte eine aussagekräftigere Fehlermeldung erzeugt werden, und die Zuweisung wird überflüssig.
Wie sind denn die Datenstrukturen aufgebaut? Es ist komisch den Getränkenamen per `in` zu suchen, wo es sich doch offensichtlich um eine Zutatenliste handelt. Das `remove` läßt befürchten, dass der erste Eintrag der Liste der Name ist und der Rest die Zutaten. Das ist eine ganz schlechte Idee. Eigentlich sollte das dann ein Wörterbuch sein.
Der erste Eintrag der Coktails scheint auch eine besondere Bedeutung zu haben. Das ist wieder eine schlechte Idee. Wenn Du den Inhalt einer Tabelle liest, wo erste Zeile und Spalte besondere Bedeutungen haben, dann packt man das beim Einlesen in sinnvolle Strukturen und programmiert nicht überall, wo man darauf zugreift umständlichen Zugriffscode.
Was Du mit `Name = " ".join(i)` machst, verstehe ich ohne den Inhalt von Getraenkeanschluesse zu kennen, überhaupt nicht.
`zsliste` scheint irgendeine globale Liste zu sein. Die wird da gefüllt und beim nächsten Aufruf weiter gefüllt, so dass da noch alte Daten drin sind?
Ohne dass man an der Datenstruktur etwas ändert, sähe das so aus. Der Code an sich ist zwar in Ordnung, aber viel zu kompliziert und fragil, weil die Inputdaten nicht gut sind.
Code: Alles auswählen
def generiere_zusammensetzung(cocktails, getraenke_anschluesse, getraenkename):
for cocktail in cocktails:
#TODO: bessere Datenstruktur!
if getraenkename in cocktail:
zutaten = cocktail[1:]
break
else:
raise KeyError(f"Cocktail {getraenkename} nicht gefunden")
spalten_inhalt = cocktail[0][1:] # TODO: bessere Datenstruktur!
ansteuerung = []
for anschluss in getraenke_anschluesse:
name = " ".join(anschluss) # Was soll das bedeuten?
index = spalten_inhalt.index(name)
if index >= 0:
ansteuerung.append(int(zutaten[index]))
return ansteuerung
PS: hast Du irgendwas mit
viewtopic.php?f=6&t=47120 zu tun, denn dort werden auch Cocktails gemischt und der OP hat die selben Probleme mit globalen Zuständen, die er unter allen Umständen verändern will.
EDIT: anhand der Bilder sehe ich ja den Inhalt der Datenstrukturen, und sie sind wirklich schlecht.
Besser so:
Code: Alles auswählen
cocktails = {
"PinaColada": {
"Cola": 0,
"Baccardi": 2,
"Orangensaft": 5,
},
"Cuba Libre": {
"Cola": 10,
"Baccardi": 3,
"Orangensaft": 0,
}
}
Dann wird aus der Funktion:
Code: Alles auswählen
def generiere_zusammensetzung(cocktails, getraenkename):
zutaten = cocktails[getraenkename]
return zutaten
Die Struktur von Getraenkeanschluesse muß auch ein Wörterbuch sein, das Zutaten zu irgendwelchen Anschlussdaten mapt.