2016-05-13 24 views
3

Ich bin neu im Codieren also vergib mir, wenn ich etwas frage, das bereits beantwortet wurde, aber glaube mir, dass ich nach der Antwort gesucht habe und es nicht finden konnte.Python - Zähle Wörter in einem gegebenen Text

Ich habe eine Aufgabe zählen, wie viele der angegebenen Wörter im gegebenen Text sind. Wort kann ein Loch oder ein Teil eines anderen Wortes sein. Briefkasten spielt keine Rolle. Wenn das Wort mehrmals im Text erscheint, sollte es nur einmal gezählt werden. Bisher habe ich es geschafft, dies zu kommen:

def count_words(text, words): 
    count = 0 
    text = text.lower() 
    for w in words: 
     if w in text: 
      count =+ 1 

    print (count) 

count_words("How aresjfhdskfhskd you?", {"how", "are", "you", "hello"}) 
count_words("Bananas, give me bananas!!!", {"banana", "bananas"}) 
count_words("Lorem ipsum dolor sit amet, consectetuer adipiscing elit.", 
         {"sum", "hamlet", "infinity", "anything"}) 

Mit diesem Code schaffe ich Endzahl von 1 für alle Baum Texte zu bekommen und dass nur dritte ist in Ordnung.

Wie ich sehe, ist mein erstes Problem, dass mein text.lower() nichts tut und ich hart es sollte alle Fälle senken.

Mein zweites Problem ist, dass im ersten Fall "Are" nicht in "aresjfhdskfhskd" gefunden wird, aber im dritten Fall "sum" in "ipsum" gefunden wird. Beide Wörter sind Teil eines größeren Wortes, aber das erste Wort wird nicht gefunden und das zweite ist es. Auch im zweiten Fall sollte Ergebnis 2 sein, weil es Bananen und Bananen gibt, ähnlich, aber unterschiedlich.

Vielen Dank im Voraus.

+5

Ich bin noch nicht sicher über den zweiten und dritten Probleme, aber 'text.lower()' ändert nicht die Zeichenfolge . Es _returns_ die Zeichenfolge, aber in Kleinbuchstaben. Verwenden Sie 'text = text.lower()' – Arc676

+4

Der entscheidende Fehler ist "count = + 1" gegen "count + = 1". – Joost

+0

Danke euch beiden. Das hat einen Teil des Problems gelöst. – DejanJovanovic

Antwort

3

Mit sum und einen Generator Ausdruck, scheint dies die einfachste Lösung:

text = text.lower() 
count = sum(word in text for word in words) 
# bools are cast to ints (0, 1) here 
+0

Während sie korrekt ist (und das Problem löst), scheint diese Lösung das Problem nicht wirklich zu lösen, nämlich zu verstehen, was falsch ist und zu lernen. Art Zwang Tricks werden nicht helfen. Zusatz: Wenn Sie minimal gehen, können Sie auch 'text.lower()' im Ausdruck verwenden. – Joost

+0

Vielen Dank. Dies löste alle Probleme in meinem Code. – DejanJovanovic

+0

@Joost Sie haben natürlich Recht. Die tatsächlichen (banalen) Probleme wurden bereits veröffentlicht und in den Kommentaren ordnungsgemäß aufgehoben. Warum aber nicht eine sauberere, kürzere, leicht zu lesende und wahrscheinlich lehrreiche Alternative vorschlagen? – schwobaseggl

1

Ihr Code teilweise falsch. Versuchen Sie folgendes:

def count_words(text, words): 
    count = 0 
    lower_text = text.lower() 
    for w in words: 
     if w in lower_text: 
      count += 1 

    print count 

count_words("How aresjfhdskfhskd you?", {"how", "are", "you", "hello"}) 
count_words("Bananas, give me bananas!!!", {"banana", "bananas"}) 
count_words("Lorem ipsum dolor sit amet, consectetuer adipiscing elit.", 
        {"sum", "hamlet", "infinity", "anything"}) 

Dies funktioniert nur in Python 2.7 aber so, wenn Sie Python verwenden 3+ Sie die endgültige print-print(count) ändern müssen.

+0

Funktioniert auch. Vielen Dank für einen anderen Ansatz. – DejanJovanovic

2

First - Strings sind unveränderbar, also text.lower() ändert sich nicht text selbst, aber gibt neue Instanz zurück - lowcased. Andere Problem ist, dass if a in base prüft, ob vorhanden ist, ohne Informationen, wie oft ...

def count_words(text, words): 
    count = 0 
    lower_text = text.lower() 
    for w in words: 
     print w + " - " + str(lower_text.count(w)) 

print "1" 
count_words("How aresjfhdskfhskd you?", {"how", "are", "you", "hello"}) 
print "2" 
count_words("Bananas, give me bananas!!!", {"banana", "bananas"}) 
print "3" 
count_words("Lorem ipsum dolor sit amet, consectetuer adipiscing elit.", 
        {"sum", "hamlet", "infinity", "anything"}) 
+0

Ich weiß jetzt, was ich falsch gemacht habe. Danke euch allen. – DejanJovanovic

+1

@DejanJovanovic Kein Problem - Schwobaseggls Antwort ist mehr Pythonic, aber ich denke, du musst dich darauf vorbereiten. Wenn Sie eine gute Informationsquelle benötigen, folgen Sie bitte diesem Link http: //www.diveintopython.net/:) –

+0

Danke Kumpel. Ich werde sicher folgen, da ich weiß, wie viel ich nicht weiß. :) – DejanJovanovic

Verwandte Themen