dictionary mit list-elementen befüllen

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
alX1111
User
Beiträge: 6
Registriert: Donnerstag 22. April 2021, 18:02

Hallo zusammen,
ich versuche, ein dictionary mit den Elementen einer Liste zu befüllen und danach auszugeben.
Es wäre saunett, wenn jemand mir kurz meine(n) Fehler erklären könnte!

Im Prinzip überprüfe ich mit folgendem kurzen Code, ob in einer Liste Elemente doppelt vorkommen und wenn ja, gibt die Funktion das erste solche Element zurück.
Dazu überprüfe ich, ob das betreffende Element bereits im Dictionary ist und schreibe es andernfalls rein...
Zwei Fragen:
- Warum funktioniert die Anweisung in Zeile 8 als Alternative zu Zeile 7 nicht? Sollte doch eigentlich dasselbe machen...
- Wie schaffe ich es, das erstellte und gefüllte dictionary auszugeben? Wollte das in Zeile 9 machen...


1 def duplicate(array):
2 hashy = {}

3 for index in array:
4 if hashy.get(index):
5 return index
6 else:
7 hashy[index] = True
8 #hashy.udpate({index: 'True'})
9 #print(hashy)

10 print(duplicate(["a", "b", "c", "d", "c", "e", "f"]))


Also, falls jemand kurz die Zeit für diese Fragen findet, würd ich mich freuen!
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird mit 4 Leerzeichen pro Ebene, nicht 3.
Das was Du array nennst, ist eine Liste. Da die Funktion aber mit jedem iterierbaren Objekt arbeiten kann, würde man das gar nicht mit dem Namen so einschränken.
Das was Du `index` nennst, ist auch kein Index, sondern ein allgemeines Element.
Da Du mit dem Ergebnis von get gar nichts machst, willst Du wahrscheinlich nur den in-Operator verwenden.
Wenn man ein Element eines Wörterbuchs setzen will, benutzt man nicht update, was aber theoretisch auch funktionieren sollte, wenn es richtig geschrieben wäre.
Das `print` wird nie erreicht, weil Du die Schleife per `return` verläßt, und damit die Funktion.

Aber da Du den Wert des Wörterbuchs eh nicht brauchst, willst Du eigentlich ein `set` verwenden.

Code: Alles auswählen

def duplicate(iterable):
    seen = set()
    for item in iterable:
        if item in seen:
            break
        seen.add(item)
    print(seen)
    return item  

print(duplicate(["a", "b", "c", "d", "c", "e", "f"]))
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Den Randfall, das `iterable` leer ist könnte man noch anders lösen als den impliziten `NameError`/`UnboundLocalError`.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
alX1111
User
Beiträge: 6
Registriert: Donnerstag 22. April 2021, 18:02

Vielen Dank!!!
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Der Code hat noch den weiteren Fehler, falls es keine doppelten Einträge gibt.

Code: Alles auswählen

def duplicate(iterable):
    seen = set()
    for item in iterable:
        if item in seen:
            break
        seen.add(item)
    else:
        raise ValueError("keine doppelten Einträge")
    print(seen)
    return item  

print(duplicate(["a", "b", "c", "d", "c", "e", "f"]))
Antworten