Seite 1 von 1

Python: Wert aus einer Liste an einen Namen hängen

Verfasst: Mittwoch 3. Juli 2019, 15:22
von InformatikPython
Guten Tag,

ich habe ein Programm erstellt (Inhalt nicht nennenswert) und bin dabei, die Perfomance des Programms zu verbessern.

Bisher erstelle ich sechs Variablen mit dem gleichen Rechenschema in sechs unterschiedlichen Berechnungen(siehe Auszug).

Die Nummer, die in der Liste in Reihe 1 (von Null ausgehend) vorzufinden ist, steht bisher hinter meinem Namen, den ich deklariere. Mit einer for-Schleife würde ich gerne die Berechnung nur einmal aufstellen, vorbei aber für jeden Namen diese Berechnung durchgeführt wird.

Code: Alles auswählen

counter = []
schalter1 = [1, 1011021]
schalter2 = [2, 1051101]
schalter3 = [3, 1111121]
schalter4 = [4, 1171231]
schalter5 = [5, 2012041]
schalter6 = [6, 2052121]
counter.append(schalter1)
counter.append(schalter2)
counter.append(schalter3)
counter.append(schalter4)
counter.append(schalter5)
counter.append(schalter6)
print(counter)

dauerSchalter1011021 = beginnSchalter1011021 - endeSchalter1011021
# und die gleiche Berechnung für die anderen Listwerte auch

dauerSchalter(counter[2,1]) = beginnSchalter1111121 - endeSchalter1111121 # möglich?

print(dauerSchalter(counter[2,1]))
# somit: dauerSchalter1111121 --> Ergebnis 7

Ist es generell überhaupt möglich, einen Wert aus der Liste an einen Namen zu hängen?

Vielen Dank im Voraus

Re: Python: Wert aus einer Liste an einen Namen hängen

Verfasst: Mittwoch 3. Juli 2019, 15:30
von __deets__
Was du suchst ist eine andere Datenstruktur. Ein Woerterbuch oder auch dictionary/mapping. Damit kannst du Werte abhaengig von anderen Datenstrukturen berechnen. Mir ist an deinem Code nicht wirklich klar geworden worauf du hinaus willst, aber vielleicht hilft dir das hier weiter:

Code: Alles auswählen

beginn = {
    "1011021" : 1345,
}
ende = {
   "1011021": 2000,
}

dauer = { key : ende[key] - beginn[key] for key in beginn }

Re: Python: Wert aus einer Liste an einen Namen hängen

Verfasst: Mittwoch 3. Juli 2019, 16:49
von InformatikPython
Schon einmal vielen Dank für die Hilfe.
Ich habe den Code (für das Forum) etwas ausführlicher geschrieben.
Es ist auch nur ein Beispiel, welches im gesamten Programm ausführlicher ist.
Mir geht es erstmal nur um das generelle Verständnis.

Code: Alles auswählen

# diesen Liste möchte ich nur einmal erstellen
counter = []
schalter1 = [1, 1]
schalter2 = [2, 2]
schalter3 = [3, 3]
schalter4 = [4, 4]
schalter5 = [5, 5]
schalter6 = [6, 6]
counter.append(schalter1)
counter.append(schalter2)
counter.append(schalter3)
counter.append(schalter4)
counter.append(schalter5)
counter.append(schalter6)
print(counter)

#bspw. die Folgenden Berechnungen sind immer gleich, aber mit einer anderen Zahl
dauerSchalter1 = beginnSchalter1 - endeSchalter1
dauerSchalter2 = beginnSchalter2 - endeSchalter2
dauerSchalter3 = beginnSchalter3 - endeSchalter3
dauerSchalter4 = beginnSchalter4 - endeSchalter4
dauerSchalter5 = beginnSchalter5 - endeSchalter5
dauerSchalter6 = beginnSchalter6 - endeSchalter6


# von diesen Blöcken habe ich aber mehrere:
warteschlangenlaengeSchalter1 = # hier kommt dann eine bestimmte Berechnung
warteschlangenlaengeSchalter2 = # hier kommt dann eine bestimmte Berechnung
warteschlangenlaengeSchalter3 = # hier kommt dann eine bestimmte Berechnung
warteschlangenlaengeSchalter4 = # hier kommt dann eine bestimmte Berechnung
warteschlangenlaengeSchalter5 = # hier kommt dann eine bestimmte Berechnung
warteschlangenlaengeSchalter6 = # hier kommt dann eine bestimmte Berechnung

# Ziel
x = 0
b = 0
for i in range(len(counter)):
    dauerSchalter(counter[x, 1]) = beginnSchalter(counter[x, 1]) - endeSchalter(counter[x, 1])
    x += 1	# wobei wahrscheinlich auch i als Parameter möglich ist

for a in range(len(counter)):
    warteschlangenlaengeSchalter(counter[b, 1]) = # Berechnung
    b += 1
    
# für das (counter[x, 1]) würde dann der passende Wert aus der Liste angegeben werden: also bspw. warteschlangenlaengeSchalter4

Re: Python: Wert aus einer Liste an einen Namen hängen

Verfasst: Mittwoch 3. Juli 2019, 16:52
von __deets__
Meine Antwort bleibt gleich. Wenn du Variablen durchnummerierst, und dir wuenschst sie wuerden aus dem nichts entstehen, sind Datenstrukturen deine Antwort. Listen und Woerterbuecher.

Re: Python: Wert aus einer Liste an einen Namen hängen

Verfasst: Mittwoch 3. Juli 2019, 17:02
von InformatikPython
Die Werte (bspw. 1345 und 2000) entstehen in meinem Programm durch eine Simulation (simpy). Diese Werte sind somit in Variablen hinterlegt.

Re: Python: Wert aus einer Liste an einen Namen hängen

Verfasst: Mittwoch 3. Juli 2019, 17:08
von __deets__
Wieso erzwingt simpy die Erzeugung von Werten in Variablen? Generiert es Code?

Re: Python: Wert aus einer Liste an einen Namen hängen

Verfasst: Mittwoch 3. Juli 2019, 17:14
von __blackjack__
@InformatikPython: Das sieht teilweise nicht nach Python aus. Warum schreibst Du

Code: Alles auswählen

counter = []
schalter1 = [1, 1]
schalter2 = [2, 2]
schalter3 = [3, 3]
schalter4 = [4, 4]
schalter5 = [5, 5]
schalter6 = [6, 6]
counter.append(schalter1)
counter.append(schalter2)
counter.append(schalter3)
counter.append(schalter4)
counter.append(schalter5)
counter.append(schalter6)
Das ist doch einfach nur:

Code: Alles auswählen

counter = [[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]]
Wenn Du Namen nummerierst, machst Du in in aller Regel etwas falsch. Man will da nicht einzelne Namen haben, sondern eine Datenstrukur. Oft eine Liste.

Bei den Schleifen stimmt der Kommentar im Code das man für `x` einfach `i` nehmen sollte, allerdings sollte man an der Stelle `i` schon gar nicht haben, denn ``for i in range(len(sequence)):`` nur um `i` dann als Index in `sequence` zu verwenden ist in Python ein „anti pattern“. Man kann in Python direkt über die Elemente von Sequenzen iterieren, ohne den Umweg über einen Index.

Wenn man über mehrere Sequenzen ”parallel” iterieren möchte, nimmt man die `zip()`-Funktion zum zusammenführen für die Schleife.

Also beispielsweise um aus den Werten in den Listen `beginn_schalter` und `ende_schalter` Werte für eine `dauer_schalter`-Liste zu berechnen:

Code: Alles auswählen

dauer_schalter = list()
for beginn, ende in zip(beginn_schalter, ende_schalter):
    dauer_schalter.append(beginn - ende)
Oder als „list comprehension“:

Code: Alles auswählen

dauer_schalter = [
    beginn - ende for beginn, ende in zip(beginn_schalter, ende_schalter)
]
Zur Namensschreibweise: klein_mit_unterstrichen für alles ausser Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).