Ошибка при попытке подсчета вхождений каждой буквы из файла - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь создать программу, которая подсчитывает вхождения каждой буквы из текста, извлеченного из другого файла. Я еще не слишком далеко продвинулся, я только что выполнил свой первый тест на букву А и не могу go дальше. Это была моя первая попытка присвоить нескольким переменным одно значение, и именно здесь произошла моя ошибка? Вот мой код, go просто, я не очень хорош в этом, но я пытаюсь выучить.

    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)

Вот моя ошибка, распечатать:

    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

Ответы [ 5 ]

0 голосов
/ 03 мая 2020

Так что это то, где я сейчас нахожусь ... Я сделал одно из них для каждого письма ... это только возвращает результаты для A. Я попытался добавить вызов к каждому из них в конце, и это выполняет только первый. Это вернуло правильное число для A, так что у меня есть это для меня.

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)
0 голосов
/ 02 мая 2020

Даже с поправками Massimo вы не сможете присвоить счет глобальной переменной (AZ определен вне функции). Однако есть способ сделать это, просто объявив global A внутри функции. Но вы, вероятно, не захотите этого для всех 26 букв алфавита.

В коллекциях есть удобная функция, называемая Counter , которая будет получать количество букв в строке (или любом тексте).

Счетчик может получить счетчик любой итерации.

Он может быть использован следующим образом:

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])

Он считает гласные в этом файле (все они были преобразованы в нижний регистр (здесь c = Counter(f.read().lower())).

a 11745
e 17696
i 10392
o 10957
u 3934

Обновление:

Видя, что вам не нужно использовать любую импортированную библиотеку, можно использовать следующее:

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)

Хотя функции подсчета букв не требуется:

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)

Вы также можете использовать словарь для ведите счет увиденных букв

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])

Update2:

Просто понял, что я не следую вашему методу. Вот оно, но вы заметите, что есть только 1 функция, которая принимает букву в качестве аргумента вместо отдельной функции для каждой из 26 букв.

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))

Здесь LINES - это глобальный список всех строк в файле, читаемый как LINES = file.readlines(). Таким образом, программа может читать строки для более чем 1 буквы вместо чтения файла для первой буквы.

Когда я учился в школе, нам приходилось делать загадку поиска слова, где слово могло быть нашел в 1 из восьми направлений (N, NE, E, SE, S, ...), и я создал функцию для каждого из 8 направлений.

Однако теперь я обнаружил, что лучше создать только одна функция и передать направление в качестве параметра функции и внутри функции для перемещения в переданном направлении.

Надеюсь, этот пример, следующий вашему подходу, будет полезен. (Просто говорю, что нет необходимости создавать 26 функций, когда это будет делать)

0 голосов
/ 02 мая 2020

Я новичок в python, поэтому не вините меня, если я ошибаюсь :))

  1. Я думаю, что ваша переменная выходит за рамки.

Попробуйте это.

    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()

Удачи!

0 голосов
/ 02 мая 2020
letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

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

for letter in letters:
    occurences = ''.join(lines).count(letter)
    print(letter + ": " + str(occurences))

Это полный код вашей проблемы. Вам не нужно делать функцию для подсчета каждой буквы.

0 голосов
/ 02 мая 2020

Я думаю, что вы хотите учиться самостоятельно, шаг за шагом. Поэтому я не даю вам готового решения, но исправляю две ошибки:

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

, если буква == 'a' или буква == 'A':

И вы можете упростить первые два цикла в одном:

for line in file:
    for letter in line:
...