Lettera Contare su una stringa

Python newb qui. I m cercando di contare il numero di lettera “a”s in una determinata stringa. Il codice è riportato di seguito. Mantiene la restituzione di 1 invece di 3 nella stringa “banana”. Qualsiasi input apprezzato.

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')
  • Penso che il tuo codice indentato correttamente. Si sarebbe ottenuto un rientro di errore.
InformationsquelleAutor shaytac | 2010-05-28

 

11 Replies
  1. 38

    Le altre risposte mostrare ciò che è sbagliato con il vostro codice. Ma c’è anche un built-in e modo per farlo, se non eri solo facendo questo per un esercizio di:

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

    Danben ha dato questa versione corretta:

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

    Qui ci sono alcuni altri modi per farlo, con la speranza che vi insegnerà di più su Python!

    Simile, ma più breve for loop. Sfrutta il fatto che i valori booleani possono trasformarsi in 1 se è true e 0 se falso:

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

    Breve per i loop possono generalmente essere trasformato in lista/generatore di genericità. Questo crea un elenco di numeri interi corrispondenti per ogni lettera, con 0 se la lettera non corrisponde char e 1 se lo fa, e quindi la somma di loro:

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

    Il prossimo filtra tutti i caratteri che non corrispondono char, e conta quanti sono di sinistra:

    def count_letters(word, char):
      return len([c for c in word if c == char])
    • Grazie, ma sì i m cercando di ottenere la mia testa intorno al concetto.
    • non hai bisogno di int() intorno a un valore booleano in Python: True == 1 and False == 0 ideone.com/k4QLc ideone.com/5dHkK
    • Sebastian: molto interessante! non sapevo che le. modificato per riflettere che
    • Ecco un’altra variante sum(1 for x in iterable if x == value). Può essere utile se il iterable non ha count() metodo.
    • Ho notato che la ‘banana’.conte(‘ana’) restituisce 1, anziché 2 come ci si potrebbe aspettare.
    • vorrei solo aspettare 1. .count() conta non sovrapposti istanze solo

  2. 11

    Il problema è che si sta utilizzando count di riferimento sia per la posizione nella parola che si sta verificando, e il numero di char avete visto, e si utilizza char di riferimento sia per il carattere di input che si sta verificando, e l’attuale carattere di una stringa. Utilizzare variabili separate, invece.

    Inoltre, spostare il return istruzione al di fuori del loop; in caso contrario potrete sempre ritornare, dopo un controllo, il primo carattere.

    Infine, è necessario un solo ciclo per scorrere la stringa. Sbarazzarsi di esterno while loop e non avrete bisogno di tenere traccia della posizione nella stringa.

    L’assunzione di questi suggerimenti, il codice sarebbe simile a questa:

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

    Un modo semplice è il seguente:

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

    O, c’è un altro modo di conteggio di ogni elemento direttamente:

    from collections import Counter
    Counter('banana')

    Naturalmente, è possibile specificare un elemento, ad esempio

    Counter('banana')['a']
  4. 6

    Tuo return è nel vostro ciclo for! Essere attenti con il rientro, si desidera che la linea return count al di fuori del ciclo. Perché il ciclo passa attraverso tutti i caratteri word, l’esterno mentre il ciclo è completamente inutili.

    Una ripulita versione:

    def count_letters(word, to_find):
        count = 0
        for char in word:
            if char == to_find:
                count += 1
        return count
    • grazie mille questo didt di esso.
  5. 4

    Si dispone di un certo numero di problemi:

    • C’è un problema con il tuo rientro come gli altri già sottolineato.
    • Non c’è bisogno di avere cicli nidificati. Un solo ciclo è abbastanza.
    • Si utilizza char a significare due cose diverse, ma la variabile char nel ciclo for sovrascriverà i dati del parametro.

    Questo codice consente di correggere tutti questi errori:

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

    Molto più conciso modo di scrivere, questo è quello di utilizzare un generatore di espressione:

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

    O utilizzare il built-in metodo conte che fa per voi:

    print 'abcbac'.count('c')
  6. 3

    Vedo un paio di cose sbagliate.

    1. Il riutilizzo di un identificatore char, in modo che possa causare problemi.
    2. Stai dicendo if char == word[count] invece di word[some index]
    3. Si torna dopo la prima iterazione del ciclo for!

    Non è nemmeno necessario il while. Se si rinomina il char param a search,

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

    "banana".count("ana") restituisce 1 invece di 2 !

    Penso che il metodo scorre la stringa (o elenco) con un passo pari alla lunghezza della sottostringa in modo da non vedere questo tipo di cose.

    Quindi, se volete un “conto pieno” è necessario implementare il proprio contatore con il corretto ciclo del passo 1

    Mi corregga se sbaglio…

  8. 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

    3

  9. 0
    x=str(input("insert string"))
    c=0
    for i in x:
       if 'a' in i:
          c=c+1
    print(c)        
    • Si prega di spiegare come il codice risponde alla domanda.

Lascia un commento