2017-02-16 4 views
-1

Ich habe ein Problem, an dem ich arbeite, wo ich die Anzahl der Wörter in einer Zeichenfolge ohne die split() Funktion in Python zählen muss. Ich dachte an einen Ansatz, wo ich eine Variable word=0 nehmen und es jedes Mal erhöhen kann, wenn ein leerer Platz in der Zeichenfolge ist, aber es scheint nicht zu funktionieren, da es immer eine Zählung weniger als die tatsächliche Anzahl gab.zählen Wörter in einer Zeichenfolge ohne Verwendung von Split

s="the sky is blue" 

def countW(s): 
    print(s) 
    word=0 
    for i in s: 
     if i==" ": 
      word=word+1 
    print(word) 
countW(s) 

Ich weiß, es ist eine einfache Frage, aber ich habe Schwierigkeiten zu verstehen, was kann ich sonst noch in Betracht halten, um sicherzustellen, dass ich die richtige Zahl zu erhalten. Der zweite Ansatz, an den ich dachte, betrifft zu viel für die Erstellung von Schleifen und Arrays und dann für die Konvertierung von Strings. Kann mir jemand auf einen einfacheren Ansatz hinweisen, bei dem ich die zeitliche Komplexität dafür nicht verlängere.

+0

def COUNTW (s): print (s) Wort = 0 für i in s: wenn i ==“„: Wort = word + 1 Druck (Wort) COUNTW (s) –

+0

's.count (" ") + 1' sollte es tun. –

+0

Mögliches Duplikat von [Zählvorkommen eines Zeichens in einer Zeichenkette] (http://stackoverflow.com/questions/1155617/count-occurrence-of-a-character-in-a-string) –

Antwort

1

Die Anzahl der Räume zu zählen ist ein guter Ansatz und funktioniert die meiste Zeit. Natürlich müssen Sie 1 hinzufügen, um die richtige Anzahl an Wörtern zu erhalten.

Da Sie jedoch über schlecht formatierte Zeichenfolgen besorgt sind, müssen Sie mehrere Leerzeichen, Leerzeichen am Anfang und am Ende sowie Interpunktion berücksichtigen.

Wenn Sie keine regulären Ausdrücke verwenden möchten (wie in Ezsrac's Antwort), ist hier eine Alternative, die Kombinationen von Zeichen, Zahlen und Unterstrichen als Wort berücksichtigt, genau wie \w. Es zählt einfach alle Übergänge zwischen Wort- und Nicht-Wort-Zeichen. Das Ende erfordert besondere Aufmerksamkeit, um Nicht-Wort-Zeichen am Ende zu berücksichtigen (zum Beispiel "a a " vs. "a a").

def is_word_character(c): 
    return 'a' <= c <= 'z' or 'A' <= c <= 'Z' or '0' <= c <= '9' or c == '_' 

def word_count(str): 
    c = 0 
    for i in range(1, len(str)): 
     if not is_word_character(str[i]) and is_word_character(str[i-1]): 
      c += 1 
    if is_word_character(str[-1]): 
     c += 1 
    return c 

Hier sind einige Testfälle:

>>> word_count("the sky is blue") 
4 
>>> word_count("the sky is blue.The") 
5 
>>> word_count(" the sky is blue ") 
4 
>>> word_count(" the sky is blue\nand not green ") 
7 

Wenn Sie wollen auch andere Zeichen umfassen, können Sie einfach erweitern die is_word_character Funktion, aber bewusst sein, dass es nicht möglich ist, alle Ecke Fälle zu betrachten, ohne mit sehr fortschrittlichen Techniken. Betrachten Sie beispielsweise "You are good-looking" vs. "This is good-looking into the sky". Es ist nicht möglich, dass ein so einfaches Programm erkennt, dass das erste ein zusammengesetztes Adjektiv ist, während das zweite aus zwei schlecht verknüpften Sätzen besteht.

+0

Ich habe das nur versucht, aber ich frage mich nur, ob es alle Randfälle passt oder wenn ihre ist ein besserer Ansatz als diese, Vermeidung der Verwendung von Python direkte Funktionen wie count() oder split() –

+0

@Faith verloren Da Sie über Kante besorgt sind Fälle, habe ich eine andere Lösung hinzugefügt – koalo

+0

gut der Code, den Sie erwähnt, wird in einem Fall fehlschlagen, in dem jemand eine schlecht formatierte Zeichenfolge eingegeben hat. Bsp: str = "Der Himmel ist blau." –

0

wenn Sie wirklich Split nicht verwenden möchten Sie versuchen, regex könnte:

import re 
s= "the sky is blue" 
count = len(re.findall(r'\w+', s)) 
print (count) 
+0

Hallo vielen Dank, Regex, das du erwähntest, ist atleast, den Testfall passierend, der direkte Raumzählung schlägt fehl. Ex - s = "der Himmel ist blau." Gibt die richtige Antwort von 5 –

1

Sie auch itertools.groupby nutzen könnten, durch die Gruppierung, ob die Zeichen sind alphanumerischen oder nicht, und alle Werte Summieren (True gleich 1).

>>> s = "the sky is blue" 
>>> sum(k for (k, g) in itertools.groupby(s, key=str.isalnum)) 
4 
1

Die einfachsten endlichen Automaten mit Zuständen - innerhalb eines Wortes oder außerhalb. Pseudo-Code:

InsideWord = false 
Count = 0 
for c in s 
    if c is not letter 
       InsideWord = false 
    else 
     if not InsideWord 
       Count++ 
       InsideWord = true 
Verwandte Themen