liste systematisch erweitern und in einer metaliste speichern

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
blutigeranfaenger
User
Beiträge: 65
Registriert: Dienstag 4. März 2014, 12:04

Hallo zusammen,
ich möchte eine Liste gerne systematisch um jeweils ein Element erweitern und das ganze in einer metaliste speichern.
Das Endergebnis soll so aussehen:

Code: Alles auswählen

liste_a = [10,3]
liste_b =  [9,3,3]
liste_c= [8,3,3]  # usw, bis liste_h = [3, 3, 3, 3, 3, 3, 3, 3, 3]
metaliste = [liste_a,liste_b,liste_c,liste_d,liste_e,liste_f,liste_g,liste_h]
Es geht mir am Ende um gewichtete Wahrscheinlichkeiten: beim ersten Mal gibt es nur zwei Elemente zur Auswahl, wobei die Wahrscheinlichkeit für das erste Element mehr als drei mal so hoch ist, am Ende sind es 9 Elemente mit gleich hoher Wahrscheinlichkeit.
Wenn ich folgende mache, kommt auf der Konsole das gewünschte Ergebnis:

Code: Alles auswählen

#!/usr/bin/env python3
neliste = [10,3]
for i in range(8):
    print(neliste)
    neliste.append(3)
    neliste[0] = neliste[0] -1
Es klappt aber nicht, und da stelle ich mich wahrscheinlich ziemlich doof an,das ganze in einer neuen Variablen zu speichern. Jedenfalls kommt nach

Code: Alles auswählen

#!/usr/bin/env python3
metaliste = [ ]
neliste = [10,3]
for i in range(8):
    neliste.append(3)
    neliste[0] = neliste[0] -1
    metaliste.append(neliste)
print(metaliste)
folgendes Ergebnis:

Code: Alles auswählen

[[2, 3, 3, 3, 3, 3, 3, 3, 3, 3], [2, 3, 3, 3, 3, 3, 3, 3, 3, 3], [2, 3, 3, 3, 3, 3, 3, 3, 3, 3], [2, 3, 3, 3, 3, 3, 3, 3, 3, 3], [2, 3, 3, 3, 3, 3, 3, 3, 3, 3], [2, 3, 3, 3, 3, 3, 3, 3, 3, 3], [2, 3, 3, 3, 3, 3, 3, 3, 3, 3], [2, 3, 3, 3, 3, 3, 3, 3, 3, 3]]
Wie kann ich das gewünschte Ergebnis erzielen?
Danke für Eure Geduld!
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Du veränderst immer die selbe Liste, anstatt dass Du neue Listen erzeugst. Listen verändern ist deshalb in Python selten eine gute Idee.
Warum erzeugst Du nicht die Listen direkt?

Code: Alles auswählen

metaliste = [
    [i] + [3] * (11 - i)
    for i in range(10, 1, -1)
]
blutigeranfaenger
User
Beiträge: 65
Registriert: Dienstag 4. März 2014, 12:04

Cool, danke!
Mir war nicht klar dass man innerhalb von [ ] einen loop erzeugen kann,
oder habe ich da etwas falsch verstanden?
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

Nein, hast du richtig verstanden. Das Stichwort ist list comprehension.
blutigeranfaenger
User
Beiträge: 65
Registriert: Dienstag 4. März 2014, 12:04

Ok, das werde ich mir genauer zu Gemüte führen!
Antworten