Seite 1 von 1

Dictionary Klammer

Verfasst: Montag 15. Mai 2023, 22:57
von norgsmen
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

Re: Dictionary Klammer

Verfasst: Montag 15. Mai 2023, 23:02
von Sirius3
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.

Re: Dictionary Klammer

Verfasst: Dienstag 16. Mai 2023, 08:56
von imonbln
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)

Re: Dictionary Klammer

Verfasst: Dienstag 16. Mai 2023, 09:33
von norgsmen
@Sirius3 Danke dir für die Erklärung und das Beispiel

Re: Dictionary Klammer

Verfasst: Dienstag 16. Mai 2023, 10:36
von __blackjack__
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()