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

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
InformatikPython
User
Beiträge: 3
Registriert: Mittwoch 3. Juli 2019, 15:13

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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 }
InformatikPython
User
Beiträge: 3
Registriert: Mittwoch 3. Juli 2019, 15:13

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
Zuletzt geändert von InformatikPython am Mittwoch 3. Juli 2019, 16:53, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Meine Antwort bleibt gleich. Wenn du Variablen durchnummerierst, und dir wuenschst sie wuerden aus dem nichts entstehen, sind Datenstrukturen deine Antwort. Listen und Woerterbuecher.
InformatikPython
User
Beiträge: 3
Registriert: Mittwoch 3. Juli 2019, 15:13

Die Werte (bspw. 1345 und 2000) entstehen in meinem Programm durch eine Simulation (simpy). Diese Werte sind somit in Variablen hinterlegt.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wieso erzwingt simpy die Erzeugung von Werten in Variablen? Generiert es Code?
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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).
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten