2016-05-31 4 views
2

Wissen Sie, warum habe ich eine "1" in der zweiten Zeile der Ausgabe gedruckt?Warum gibt mein Wortzähler die Zeile `1` aus?

def word_map(string): 
    dict = {} 
    for word in string.split(): 
     word = filter(str.isalnum, word).lower() 
     word = word.split() 
     if word in dict: 
      dict[word] +=1 
     else: 
      dict[word] = 1 
    return dict 

dict = word_map("This is a string , this is another string too") 
for k in dict: 
    print k, dict[k] 

Ergebnis ist:

a 1 
1 
string 2 
this 2 
is 2 
too 1 
another 1 

Process finished with exit code 0 
+5

** Pflicht Warnung ** - Verwenden Sie keine 'dict' als Variablennamen –

+0

warum? PyCharm zeigt keine Warnung dafür –

+2

@MonaJalal Es überschreibt die eingebaute 'dict' Funktion. –

Antwort

5

Da eines der Elemente der geteilten ',' ist, die an '' gefiltert wird.

Sie tun also dict[''] = 1.

Angenommen, Sie versuchen, die Wörter in einem Satz zu zählen, müssen Sie entweder überprüfen, ob das Wort gültig ist, nachdem Sie es gefiltert haben, oder während Sie drucken. Zum Beispiel wird dies für Sie arbeiten.

def word_map(string): 
    word_dict = {} 
    for word in string.split(): 
     word = ''.join(filter(str.isalnum, word)).lower() 
     if word.strip(): 
      if word in word_dict: 
       word_dict[word] +=1 
      else: 
       word_dict[word] = 1 
    return word_dict 
0

Ich denke, es wird für "," gedruckt. Sie haben insgesamt 10 Wörter einschließlich "," (lassen Sie uns "," als ein Wort betrachten). Also, wenn Sie alle Zahlen sehen, sollte das die Antwort geben.

+0

Ich glaube, du liegst falsch, weil ich' word = filter (str.isalnum, word) .lower() ' –

+0

benutze @MonaJalal Genau deshalb passiert es. Ich weiß nicht, warum du denkst, das würde verhindern, dass es ins Wörterbuch gestellt wird. Sie überprüfen nicht "Wort", nachdem Sie es gefiltert haben. –

0

Die folgende Lösung funktioniert auch:

def word_map(string): 
    word_dict = {} 
    for word in string.split(): 
     word = filter(str.isalnum, word).lower() 
     word = word.strip() 
     if word != '': 
      if word in word_dict.keys(): 
       word_dict[word] +=1 
      else: 
       word_dict[word] = 1 
    return word_dict 

my_dict= word_map("This is a string , this is another string too") 
for k in my_dict: 
    print k, my_dict[k] 
+1

Das ist genau das, was meine Antwort sagt, außer dass es vor der Überprüfung streift. –

+0

Ihre Antwort wird angenommen. Ich habe gerade meinen korrigierten Code geschrieben –

Verwandte Themen