Dictionary mit Buchstabenanzahl

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
cindyH1
User
Beiträge: 5
Registriert: Dienstag 1. Mai 2018, 09:16

Hallo!
Ich muss eine Funktion erstellen, die für einen gegebenen Text ein Dictionary zurückgibt, das für alle vorkommenden Buchstaben deren Anzahl enthält
der Text ist zufällig und wird wie folgt erstellt:

Code: Alles auswählen

import random
def Wort(n):
    n=random.randint(2,9) 
    letters= random.sample(string.ascii_lowercase,n) 
    wort=''.join(letters) 
    return wort
Satz=Wort(1)+' '+Wort(2)+' '+Wort(3)+' '+Wort(4)+' '+Wort(5)
print(Satz)
Ich hab nur leider keine Ahnung wie ich das mit dem Wörterbuch angehen soll...
nezzcarth
User
Beiträge: 1754
Registriert: Samstag 16. April 2011, 12:47

Was hast du denn schon versucht? Es gibt verschiedene Arten, das zu lösen. Wenn du es dir leicht machen möchtest, schau dir mal die Doku zum 'collections'-Modul an. Da gibt es etwas (bzw. eigentlich sogar zwei Dinge), mit dem du das in einer Zeile lösen kannst. Ansonsten brauchst du halt eine Schleife und die Dictionary-Methoden 'get' oder 'setdefault'. Das ist etwas umständlicher, aber vielleicht lehrreich.

(Dein Code-Beispiel ist übrigens teilweise etwas seltsam: Der Parameter 'n' wird z.B. gar nicht verwendet, sondern in der Funktion überschrieben und die verwendest einmal 'join' und unten beim Zusammensetzen machst du es umständlich einzeln).
cindyH1
User
Beiträge: 5
Registriert: Dienstag 1. Mai 2018, 09:16

Code: Alles auswählen

import random
def Wort(n):
    n=random.randint(2,9) #n ist eine beliebige Zahl zw. 2&9 und die Anzahl der Buchstaben eines Wortes
    letters= random.sample(string.ascii_lowercase,n) #gibt eine Liste mit n vielen, beliebigen Buchstaben aus
    wort=''.join(letters) #macht aus der lsite der einzelnen Buchstaben einen String mit allen Buchstaben=Wort
    return wort
Satz=Wort(1)+' '+Wort(2)+' '+Wort(3)+' '+Wort(4)+' '+Wort(5)
print(Satz)
def dictionary(Text):
    menge1=set(Text) #zuerst eine Menge aus dem Satz erstellen, diese enthält jeden Buchstaben genau 1 mal
    menge=list(menge1) #Menge in eine Liste umwandeln weil so auf die einzelnen Elemente zugegriffen werden kann
    menge.remove(' ') #der Abstand ist kein Buchstabe daher entfernen
    dicti={}
    i=len(menge)
    i=i-1
    while i<=len(menge):
        dicti[menge[i]]=Text.count(menge[i])        
    return dicti
print(dictionary(Satz))
also mal abgesehen davon dass vieles komplizierter ist als es sein könnte(ich bin neu in python und versuche es einfach mal so zu machen damit ich es verstehe), dieser code für das dictionary funktioniert nicht, ich verstehe aber nicht warum, ich hätte gedacht dass so das dictionary immer um das i-te element in der menge erweitert wird, bis i gleich der anzahl der elemente der menge ist.... wo ist der fehler?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sehr viel komplizierter und dadurch auch kaputt. Über strings kann man in Python direkt iterieren. Ganz generell machst du immer etwas falsch, wenn du explizite Indizes verwendest. Besonders mit while!

Code: Alles auswählen

VERBOTEN = {“ “}

for c in text:
     if c not in VERBOTEN:
        ... # hier mit dem dict arbeiten. Schau dir mal collections.defaultdict an!
nezzcarth
User
Beiträge: 1754
Registriert: Samstag 16. April 2011, 12:47

cindyH1 hat geschrieben:wo ist der fehler?
Soweit ich es sehe, ist ein Fehler zum Beispiel, dass du die Variable 'i' gar nicht änderst. Generell versucht man in Python nach Möglichkeit Konstrukte zu vermeiden, wo manuell die Länge eines Elements ermittelt und eine Variable in/dekrementiert wird, da man meistens direkt iterieren kann.

Deinen Ansatz könnte man zum Beispiel so umschreiben:

Code: Alles auswählen

def get_frequencies(text):
    result = dict()
    chars = [char for char in text if not char == ' ']
    for char in set(chars):
        result[char] =  text.count(char)
    return result
Oder Kürzer:

Code: Alles auswählen

def get_frequencies(text):
    chars = [char for char in text if not char == ' ']
    return {char: text.count(char) for char in set(chars)}
Weiterhin finde ich die Verwendung von str.count nicht so gut. Ich habe es nicht gemessen, aber wahrscheinlich wäre es effizienter, selbst zu zählen, da ja der String für jeden Buchstaben auf's Neue durchsucht wird. Oder wenn du eh schon solche "Bequemlichkeits-Funktionalitäten" wie 'count' verwendest, vielleicht doch mal in das Collections-Modul zu schauen...
Antworten