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
[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()