2010-05-28 23 views
11

Python newb hier. Ich versuche, die Anzahl der Buchstaben "a" s in einer gegebenen Zeichenfolge zu zählen. Code ist unten. Es gibt 1 statt 3 in der Zeichenfolge "Banane" zurück. Jede Eingabe wird geschätzt.Buchstaben zählen auf einer Zeichenfolge

def count_letters(word, char): 
    count = 0 
    while count <= len(word): 
     for char in word: 
      if char == word[count]: 
       count += 1 
      return count 



print count_letters('banana','a') 
+0

Ich denke, Ihr Code eingerückt war korrekt. Sie hätten einen Einzugfehler erhalten. – Lucas

Antwort

26

Die anderen Antworten zeigen, was mit Ihrem Code falsch ist. Aber es gibt auch eine eingebaute Möglichkeit, dies zu tun, wenn Sie nicht nur wurden diese für eine Übung zu tun:

>>> 'banana'.count('a') 
3 

Danben gab diese korrigierte Version:

def count_letters(word, char): 
    count = 0 
    for c in word: 
    if char == c: 
     count += 1 
    return count 

Hier sind einige andere Möglichkeiten, es zu tun, hoffentlich werden sie dir mehr über Python beibringen!

Ähnliche, aber kürzere for Schleife. Nutzt die Tatsache aus, dass booleans wiederum in 1, wenn wahr und 0, wenn false:

def count_letters(word, char): 
    count = 0 
    for c in word: 
    count += (char == c) 
    return count 

Short for-Schleifen kann in der Regel in der Liste/Generator Comprehensions gedreht werden.Dies erzeugt eine Liste von ganzen Zahlen zu jedem Buchstaben entsprechen, mit 0, wenn der Brief nicht char und 1 überein, wenn es tut, und dann summiert sie:

def count_letters(word, char): 
    return sum(char == c for c in word) 

Der nächste filtert alle Zeichen, die don‘ t Spiel char, und zählt, wie viele sind links:

def count_letters(word, char): 
    return len([c for c in word if c == char]) 
+0

Danke aber yeah ich versuche, meinen Kopf um das Konzept zu bekommen. – shaytac

+2

Sie brauchen nicht 'int()' um booleschen Wert in Python: 'True == 1 und False == 0' http://ideone.com/k4QLc http://ideone.com/5dHkK – jfs

+0

@ J.F. Sebastian: sehr interessant! Ich habe das nie gewusst. bearbeitet, um das widerzuspiegeln – Claudiu

6

Ihre return ist in Ihrer for-Schleife! Seien Sie vorsichtig beim Einrücken, Sie möchten, dass die Zeile return count außerhalb der Schleife liegt. Da die for-Schleife alle Zeichen in word durchläuft, ist die äußere while-Schleife völlig überflüssig.

Eine aufgeräumte Version:

def count_letters(word, to_find): 
    count = 0 
    for char in word: 
     if char == to_find: 
      count += 1 
    return count 
+0

vielen dank dieses didt es. – shaytac

11

Ein Problem ist, dass Sie count verwenden sowohl im Wort auf den Standpunkt zu verweisen, die Sie überprüft, und die Anzahl der char Sie gesehen haben, und Sie verwenden char, um sowohl auf das zu prüfende Eingabezeichen als auch auf das aktuelle Zeichen in der Zeichenfolge zu verweisen. Verwenden Sie stattdessen separate Variablen.

Verschieben Sie auch die return Anweisung außerhalb der Schleife; Andernfalls werden Sie immer nach dem Überprüfen des ersten Zeichens zurückkehren.

Schließlich brauchen Sie nur eine Schleife, um über die Zeichenfolge zu iterieren. Entfernen Sie die äußere while Schleife und Sie müssen die Position in der Zeichenfolge nicht verfolgen.

diese Vorschläge machen, Ihr Code würde wie folgt aussehen:

def count_letters(word, char): 
    count = 0 
    for c in word: 
    if char == c: 
     count += 1 
    return count 
3

Ich sehe ein paar Dinge falsch.

  1. Sie verwenden den Bezeichner char erneut, so dass Probleme auftreten.
  2. Sie sagen if char == word[count] statt word[some index]
  3. Sie kehren nach der ersten Iteration der for-Schleife zurück!

Sie brauchen nicht einmal die while. Wenn Sie die Zeichen param zu search umbenennen,

for char in word: 
    if char == search: 
     count += 1 
return count 
2

Alternativ können Sie verwenden:

mystring = 'banana' 
number = mystring.count('a') 
3

Sie haben eine Reihe von Problemen:

  • Es gibt ein Problem mit Ihrer Einrückung, wie andere bereits darauf hingewiesen haben.
  • Es sind keine verschachtelten Schleifen erforderlich. Nur eine Schleife ist genug.
  • Sie verwenden char für zwei verschiedene Dinge, aber die Variable char in der for-Schleife überschreibt die Daten des Parameters.

Dieser Code behebt alle diese Fehler:

def count_letters(word, char): 
    count = 0 
    for c in word: 
     if char == c: 
      count += 1 
    return count 

Eine viel prägnanter Weise zu schreiben diese einen Generator Ausdruck zu verwenden ist:

def count_letters(word, char): 
    return sum(char == c for c in word) 

Oder nur die integrierte Methode verwenden count das macht das für Sie:

print 'abcbac'.count('c') 
0
def count_letter(word, char): 
    count = 0 
    for char in word: 
     if char == word: 
      count += 1 
    return count  #Your return is inside your for loop 
r = count_word("banana", "a") 
print r 
0
x=str(input("insert string")) 
c=0 
for i in x: 
    if 'a' in i: 
     c=c+1 
print(c)   
+0

Bitte erklären Sie, wie Ihr Code die Frage beantwortet. –

1
count_letters="" 

number=count_letters.count("") 

print number 
6

Ein einfacher Weg ist wie folgt:

def count_letters(word, char): 
    return word.count(char) 

Oder es gibt eine andere Möglichkeit, jedes Element direkt zu zählen:

Natürlich können Sie ein Element angeben, z.

Counter('banana')['a'] 
-2

Wort = Eingang ("ein Wort eingeben: ")

print (" 'S \ nHier jeder Buchstabe in Ihrem Wort:") für die Buchstaben im Wort: print (Brief)

Eingabe ("\ n \ nDie Eingabetaste drücken, um zu beenden.")

0

"banana".count("ana") gibt 1 statt 2 zurück!

Ich denke, die Methode iteriert über die Zeichenfolge (oder die Liste) mit einem Schritt gleich der Länge der Teilzeichenfolge, so dass es diese Art von Zeug nicht sehen.

Also, wenn Sie wollen ein „full count“ Sie haben Ihren eigenen Zähler mit der richtigen Schleife von Schritt 1

mir implementieren korrigieren, wenn ich falsch ...

Verwandte Themen