Elemente von Dictionary distict

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
Leny
User
Beiträge: 16
Registriert: Freitag 26. Mai 2017, 19:34

Hallo an alle,

ich habe ein an sich triviales Problem,kann jedoch nicht nachvollziehen, warum es passiert.
all ist ein Dictionary (beispielsweise {'3': 2,5,1,2,2,2,8}). Ich möchte deren Element distinct bekommen. Dazu habe ich folgendes gemacht:

Code: Alles auswählen

dict={}    
for i in all:
    elementedistinct=set()
    liste=all[i]
    for j in liste:
        elementedistinct.add(liste[j])
dict[i]=elementedistinct
ich kriege in der letzten Schleife den Fehler: list index out of range. Ich verstehe gar nicht warum. Das Programm soll doch aus der Schleife raus, wenn die Liste durch ist. Ich würde mich über eure Hilfe freuen.
Vielen Dank im Voraus.

Leny
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Leny: for geht über die Elemente der Liste, die Du dann als Index in die Liste wieder verwendest. Darunter auch die 8, die bei der 7-Elementigen Liste eben zum Indexerror führt.
Das verwenden von Namen eingebauter Funktionen für Variablen ist sehr verwirrend. Das ganze als dict-Comprehension:

Code: Alles auswählen

distinc_dict = {
    key: set(values) for key, values in all.items()
}
Leny
User
Beiträge: 16
Registriert: Freitag 26. Mai 2017, 19:34

Vielen Dank @Sirius3. Ich bin ein Anfänger im Python. Ich verstehe nicht so genau wie dein Code funktioniert. Könntest du bitte eine kurze Aufklärung mir geben.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dein code funktioniert nicht, weil du statt die Element der Liste in dein Set zu plazieren versuchst, auf die Liste selbst mit dem Element als Index zuzugreifen. Das geht natuerlich in die Hose:

Code: Alles auswählen

l = [100]
for element in l:
      print(element)
      print(l[element]) # KRACH, weil l nunmal keine 100 Eintraege hat, und wenn es das haette waere es katastrophal falsch!
      
Dein code zu reparieren bedeutet also einfach, j statt liste[j] als Argument an "add" zu uebergeben.

Und dann hat Sirius3 deinen Code noch verschoenert, indem er gleich eine dictionary comprehension verwandt hat. Diesen Begriff kann man googeln & nachlesen, was das ist.
Antworten