尝试计算文件中每个字母的出现次数时出错

Getting error trying to count occurences of each letter from file

我正在尝试创建一个程序来计算从另一个文件中提取的文本中每个字母的出现次数。我还没有走得太远,我只是 运行 我对字母 A 的第一次测试,无法继续。这是我第一次尝试将多个变量分配给一个值,这是我的错误发生的地方吗?这是我的代码,放轻松,我不是很擅长这些东西,但我正在努力学习。

    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

我觉得你想自学,循序渐进。 所以我没有给你一个现成的解决方案,但我纠正了两个错误:

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

if letter == 'a' or letter == 'A':

您可以将前两个 for 循环简化为一个:

for line in file:
    for letter in line:

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

祝你好运!

letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

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

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

这是您问题的完整代码。您不必编写一个函数来计算每个字母。

即使进行 更正,您仍无法将计数分配给全局变量(A-Z 在函数外部定义)。然而,有一种方法可以做到这一点,只需在函数内声明 global A 即可。但是您可能不希望所有 26 个字母都这样。

collections called Counter 中有一个方便的函数,可以计算字符串(或任何文本正文)中的字母数。

Counter 可以获取任何 iterable 的计数。

可以这样使用:

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

更新2:

刚刚意识到我没有遵循您的方法。在这里,但您会注意到只有 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()。这样,程序可以读取多个字母的行,而不是读取第一个字母的文件。

当我在学校的时候,我们必须做一个单词搜索谜题,这个单词可以在八个方向中的一个方向(N、NE、E、SE、S、...)中找到,我创建了一个8 个方向的每个方向的函数。

但是,现在我发现最好只创建一个函数并将方向作为参数传递给函数,并在函数内部按传递的方向行进。

希望遵循您的方法的这个示例对您有所帮助。 (只是说没必要创建26个函数就可以了)

所以这就是我现在所处的位置...我为每个字母都做了其中一个...它只会带回 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)