0
votes

Obtention d'une erreur en essayant de compter les occurrences de chaque lettre à partir du fichier

J'essaie de créer un programme qui compte les occurrences de chaque lettre à partir du texte extrait d'un autre fichier. Je ne suis pas encore allé trop loin, je viens de faire mon premier test pour la lettre A et je ne peux pas aller plus loin. C'était ma première tentative d'attribution de plusieurs variables à une seule valeur, est-ce là que mon erreur s'est produite? Voici mon code, allez-y doucement, je ne suis pas très bon dans ce domaine, mais j'essaie d'apprendre.

    Traceback (most recent call last):
      File "D:/Python/twentysecondprogram.py", line 2, in <module>
        A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z = 0
    TypeError: cannot unpack non-iterable int object

Voici mon impression d'erreur:

    file = open('words.txt', 'r')
    A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z = 0

    def LetterA():
        for line in file:
            words = line.split()
            for i in words:
                for letter in i:
                    if(letter == a) or (letter == A):
                        A = A + 1
        return A
    LetterA()

    print(A)


0 commentaires

5 Réponses :


0
votes

Je pense que vous voulez apprendre par vous-même, étape par étape. Donc je ne vous donne pas de solution prête mais je corrige les deux erreurs:

A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X , Y, Z = [0] * 26

si lettre == 'a' ou lettre == 'A':

Et vous pouvez simplifier les deux premières boucles for en une seule:

for line in file:
    for letter in line:


0 commentaires

0
votes

Je suis nouveau en python, alors ne me blâmez pas si je me trompe :))

  1. Je pense que votre variable est hors de portée.

Essayez ceci.

    def letter_A():
    letterA = 0
    for line in file:
        words = line.split()
        for i in words:
            for letter in i:
                if(letter == 'a') or (letter == 'A'):
                    letterA += 1
    print(letterA)


letter_A()

Bonne chance!


0 commentaires

0
votes
letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

with open('words.txt') as file:
    lines = file.readlines()

for letter in letters:
    occurences = ''.join(lines).count(letter)
    print(letter + ": " + str(occurences))
This is the complete code for you problem. You don't have to make a function for counting every single letter.

1 commentaires

Ehm ça marche mais ce n'est pas un bon exemple pour joindre (lignes) à l'intérieur de la boucle for.



0
votes

Même avec Massimo corrections, vous ne pourrez pas attribuer un décompte à une variable globale, (AZ défini en dehors de la fonction). Il existe un moyen de le faire cependant, déclarez simplement global A à l'intérieur de la fonction. Mais vous ne voudriez probablement pas cela pour les 26 lettres de l'alphabet.

Il existe une fonction pratique dans collections appelées Counter qui obtiendra le nombre de lettres dans une chaîne (ou n'importe quel corps de texte).

Le compteur peut obtenir le nombre de n'importe quel itérable.

Il pourrait être utilisé de cette façon: p>

file = open('anna.book', 'r')
LINES = file.readlines()
file.close()

def letter_counter(char):
    letter_cnt = 0
    for line in LINES:
        for letter in line:
            if letter.lower() == char.lower():
                letter_cnt += 1

    return letter_cnt

for vowel in ('a','e','i','o','u'):
    print(vowel, letter_counter(vowel))

Il compte les voyelles de ce fichier (qui ont toutes été converties en minuscules (ici c = Counter (f.read (). lower ()) code>).

letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m',
           'n','o','p','q','r','s','t','u','v','w','x','y','z']

with open('anna.book', 'r') as f:
    text = f.read().lower()

count = dict()

for letter in text:
    if letter in count:
        count[letter] += 1
    else:
        # if this is the first time this letter is seen
        count[letter] = 1

for letter in letters:
    print(letter, count[letter])

Mise à jour:

Étant donné que vous n'avez pas besoin d'utiliser de bibliothèque importée, ce qui suit pourrait être utilisé :

letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m',
           'n','o','p','q','r','s','t','u','v','w','x','y','z']

with open('anna.book', 'r') as f:
    text = f.read().lower()

for letter in letters:
    counts = text.count(letter)
    print(letter, counts)

Bien qu'il n'y ait pas vraiment besoin d'une fonction pour compter les lettres:

def letter_count(text,letter):
    return text.count(letter)

letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m',
           'n','o','p','q','r','s','t','u','v','w','x','y','z']

with open('anna.book', 'r') as f:
    text = f.read().lower()

for letter in letters:
    counts = letter_count(text, letter)
    print(letter, counts)

Vous pouvez également utiliser un dictionnaire pour compter les lettres vues

a 11745
e 17696
i 10392
o 10957
u 3934

Update2:

Just rea J'ai remarqué que je ne suivais pas votre méthode. Le voici, mais vous remarquerez qu'il n'y a qu'une seule fonction qui prend une lettre comme argument au lieu d'une fonction différente pour chacune des 26 lettres.

from collections import Counter

with open('anna.book', 'r') as f:
    c = Counter(f.read().lower())

for vowel in ('a','e','i','o','u'):
    print(vowel, c[vowel])

Ici LINES est une liste globale de toutes les lignes du fichier, lue comme LINES = file.readlines () . De cette façon, le programme peut lire les lignes de plus d'une lettre au lieu de lire le fichier pour la première lettre.

Quand j'étais à l'école, nous devions faire un puzzle de recherche de mots où le mot pouvait être trouvé dans 1 des huit directions, (N, NE, E, SE, S, ...) et j'ai créé une fonction pour chacune des 8 directions.

Cependant, maintenant j'ai trouvé préférable de créez une seule fonction et passez la direction en tant que paramètre à la fonction et à l'intérieur de la fonction, pour voyager dans la direction passée.

J'espère que cet exemple suivant votre approche sera utile. (Juste en disant qu'il n'est pas nécessaire de créer 26 fonctions quand on le fera)


3 commentaires

C'est pour une classe que je prends donc je ne peux pas utiliser les importations, essayant d'apprendre ce que ces importations font réellement un peu. merci beaucoup


@ Dmart425 J'ai ajouté quelques solutions possibles qui pourraient être utiles.


@ Dmart425 J'ai ajouté une solution suggérée qui suit votre approche.



0
votes

Voici donc où j'en suis en ce moment ... J'ai fait un de ceux-ci pour chaque lettre ... cela ne ramène que les résultats pour A. J'ai essayé d'ajouter un appel à chacun d'eux à la fin et il exécute uniquement le premier. Il a ramené le bon numéro pour A, donc je l'ai pour moi.

file = open('words.txt', 'r')
def letter_A():
    letterA = 0
    for line in file:
        words = line.split()
        for i in words:
            for letter in i:
                if(letter == 'a') or (letter == 'A'):
                    letterA += 1
    if letterA >= 1:
        print('A:', letterA)

def letter_B():
    letterB = 0
    for line in file:
        words = line.split()
        for i in words:
            for letter in i:
                if(letter == 'b') or (letter == 'B'):
                    letterB += 1
    if letterB >= 1:
        print('B:', letterB)


1 commentaires

Cela ne fonctionnera que pour la première lettre, (A), car une fois que vous avez lu le fichier complètement, la lettre suivante, (B), ne sera pas lue car le fichier a été ouvert et lu. Vous pouvez résoudre ce problème en lisant le fichier dans un tableau de lignes, pour les lignes en lignes: lignes est le tableau dans lequel vous avez lu votre fichier.