Dienstag, Januar 21, 2020

Zählen von Buchstaben in einem Wort in python-debug –

Ich versuche zu zählen, wie oft “ e “ wird in einem Wort.

def has_no_e(word):     #counts 'e's in a word
    letters = len(word)
    count = 0
    while letters >= 0:
        if word[letters-1] == 'e':
            count = count + 1
        letters = letters - 1
    print count

Es scheint zu funktionieren, außer wenn das Wort endet mit einem ‚e‘. Es zählt das ‚e‘ zweimal. Ich habe keine Ahnung, warum. Keine Hilfe?

Ich weiß mein code ist vielleicht schlampig bin, bin ich ein Anfänger!!! Ich versuche nur, um herauszufinden, die Logik hinter dem, was geschieht.

Wenn Briefe == 0 was wird dann passieren? Warum testen Sie für while letters >= 0? Können Sie erklären, warum Sie dies tun? Eine Erklärung wäre hilfreich.

InformationsquelleAutor Johnny | 2010-12-30

9 Kommentare

  1. 10

    Als andere erwähnen, die Sie implementieren können, der test mit einem einfachen word.count('e'). Es sei denn, Sie tun dies als eine einfache übung, diese ist weit besser als zu versuchen das Rad neu zu erfinden.

    Das problem mit deinem code ist, dass es zählt das Letzte Zeichen zweimal, weil Sie den Test-index -1 am Ende, die in Python gibt das Letzte Zeichen in der Zeichenfolge. Fixieren Sie es, indem Sie while letters >= 0 zu while letters > 0.

    Gibt es andere Möglichkeiten, wie Sie können, Räumen Sie Ihren code (vorausgesetzt, dies ist eine übung im lernen):

    • Python bietet eine schöne Möglichkeit der Iteration über einer Zeichenfolge mit einem for Schleife. Das ist weit übersichtlicher und einfacher zu Lesen als mit einem while Schleife und die Pflege der eigenen counter-variable. Wie Sie bereits gesehen haben hier, hinzufügen von Komplexität führt zu Fehlern. Halten Sie es einfach.
    • Die meisten Sprachen bieten eine += – operator, welcher für ganze zahlen addiert den Betrag einer Variablen. Es ist präziser als count = count + 1.
    • Verwenden, einen parameter zu definieren, welche Zeichen man zählen es flexibler zu machen. Definieren Sie ein Standard-argument für die Verwendung von char='e' in der Liste der parameter, wenn Sie einen offensichtlichen Standardwert.
    • Wählen Sie einen geeigneten Namen für die Funktion. Der name has_no_e() lässt den Leser denken, der code überprüft, um zu sehen, ob der code hat keine e -, aber was es tatsächlich ist, zählt die vorkommen von e.

    Umsetzung dieses alle zusammen, erhalten wir:

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

    Einige tests:

    >>> count_letter('tee')
    2
    >>> count_letter('tee', 't')
    1
    >>> count_letter('tee', 'f')
    0
    >>> count_letter('wh' + 'e'*100)
    100

    InformationsquelleAutor marcog

  2. 1

    Das problem ist, dass der Letzte Wert von „Buchstaben“ in Ihrer iteration „0“, und wenn dies geschieht, schauen Sie auf:

      word[letters-1]

    Bedeutung, betrachten Sie word[-1], welches in python bedeutet „letzter Buchstabe des Wortes“.

    du bist also tatsächlich zählen richtig, und das hinzufügen von einem „bonus“, wenn der Letzte Buchstabe ist ein ‚e‘.

    InformationsquelleAutor Yonatan

  3. 1

    Wird es doppelt, wenn die Endung mit einem e, weil Sie Dekrement letters einmal zu oft (weil Sie loop während letters >= 0 und Sie sollten looping, während letters > 0). Wenn letters null erreicht-Sie überprüfen word[letters-1] == word[-1] das entspricht dem letzten Buchstaben im Wort.

    InformationsquelleAutor Klaus Byskov Pedersen

  4. 1

    Viele der vorgeschlagenen Lösungen funktioniert.

    Wissen, dass in Python, list[-1] wird wieder das Letzte element der Liste.

    So, in Ihrer ursprünglichen code, wenn Sie verweisenden Wort[Zeichen-1] in einer while-Schleife eingeschränkt, durch Briefe >= 0, Sie zählen würde das ‚e‘ am Ende des Wortes zweimal (einmal, wenn die Buchstaben wurde die Länge-1 und ein zweites mal, wenn die Buchstaben 0 war).

    Zum Beispiel, wenn mein Wort war „Pete“ Ihre trace-code würde wie folgt Aussehen (wenn Sie ausgedruckt Wort[Brief] – each-Schleife.

    e (für word[3])
    t (für word[2])
    e (für Wort[1])
    P (Wort[0])
    e (für word[-1])

    Hoffe, das hilft, die Sache aufzuklären und zu zeigen, eine interessante, kleine Macke über Python.

    InformationsquelleAutor sjberry

  5. 1

    @marcog macht einige ausgezeichnete Punkte;

    in der Zwischenzeit können Sie tun, einfache debugging durch einfügen von print-Anweisungen –

    def has_no_e(word):
        letters = len(word)
        count = 0
        while letters >= 0:
            ch = word[letters-1]         # what is it looking at?
            if ch == 'e':
                count = count + 1
                print('{0} <-'.format(ch))
            else:
                print('{0}'.format(ch))
            letters = letters - 1
        print count

    dann

    has_no_e('tease')

    gibt

    e <-
    s
    a
    e <-
    t
    e <-
    3

    aus denen Sie sehen können, dass

    1. du gehst durch den string in umgekehrter Reihenfolge
    2. es ist richtig zu erkennen e s
    3. Sie sind ‚umwickeln‘, um das Ende der Schnur – daher der extra-e, wenn die Zeichenfolge endet in einem

    InformationsquelleAutor Hugh Bothwell

  6. 1

    Wenn das, was Sie wirklich wollen, ist ‚has_no_e“, dann die folgenden können geeigneter sein, als das zählen der ‚e‘ s und dann später die Prüfung für null,

    def has_no_e(word):
      return 'e' not in word
    
    >>> has_no_e('Adrian')
    True
    >>> has_no_e('test')
    False
    >>> has_no_e('NYSE')
    True

    Wenn Sie überprüfen möchten, es gibt auch keine “ E ‚ s entweder,

    def has_no_e(word):
      return 'e' not in word.lower()
    
    >>> has_no_e('NYSE')
    False

    InformationsquelleAutor aid

  7. 1

    Sie nicht haben, um eine while-Schleife. Zeichenketten können verwendet werden for-Schleifen in Python.

    def has_no_e(word):
        count = 0
        for letter in word:
            if letter == "e":
                count += 1
        print count

    oder etwas einfacher:

    def has_no_e(word):
        return sum(1 for letter in word if letter=="e")

    InformationsquelleAutor Nope

Kostenlose Online-Tests