Dictionary Klammer

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
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

Hi Leute,

es geht um folgendem Code:

Code: Alles auswählen

t = 'dies ist der text'
d = {}

for wort in t.split():
    if len(wort) in d:
        d[len(wort)].append(wort)
    else:
        d[len(wort)] = [wort]
print(d)
Wozu ist es so wichtig das hier

Code: Alles auswählen

d[len(wort)] = [wort]
[wort] in eckigen Klammern stehen muss? Wenn ich diese entferne, bekomme ich nämlich diese Fehlermeldung hier: AttributeError: 'str' object has no attribute 'append'

Code: Alles auswählen

test = {'hand': 3, 'fuß': 4}
test['kopf'] = 999
print(test)
Bei dem Beispiel kann ich aber einen Wert hinzufügen, ohne ihn extra in Klammern eckigen Klammern aufzuschreiben.

Danke fürs Antworten
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Eckigen Klammern erzeugen eine Liste. Und die Liste brauchst Du ja, um viele Wörter zu sammeln.
Klarer wäre der Code also (mit auch sinnvolleren Variablennamen):

Code: Alles auswählen

text = 'dies ist der text'
length_to_words = {}

for word in text.split():
    if len(word) not in length_to_words:
        length_to_words[len(word)] = []
    length_to_words[len(word)].append(word)
print(length_to_words)
Erzeugt eine leere Liste, wenn der Schlüssel noch nicht im Wörterbuch zu finden ist, und erweitere die Liste dann (egal ob schon da oder neu erzeugt) um das Wort.

In Deinem zweiten Beispiel hast Du keine Liste, sondern nur eine Zahl.
imonbln
User
Beiträge: 191
Registriert: Freitag 3. Dezember 2021, 17:07

Das ist vielleicht auch einer der Fälle, wo setdefault verwendet werden kann. Das versteckt die Komplexität.

Code: Alles auswählen

text = 'dies ist der text'
length_to_words = {}

for word in text.split():
      length_to_words.setdefault(len(word), []).append(word)
norgsmen
User
Beiträge: 55
Registriert: Samstag 26. Juni 2021, 22:09

@Sirius3 Danke dir für die Erklärung und das Beispiel
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei `setdefault()` seit `collections.defaultdict` eigentlich überflüssig ist:

Code: Alles auswählen

#!/usr/bin/env python3
from collections import defaultdict


def main():
    text = "dies ist der text"
    length_to_words = defaultdict(list)
    for word in text.split():
        length_to_words[len(word)].append(word)
    print(length_to_words)


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten