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

问题描述 投票:0回答:1

我正试图创建一个程序来计算从另一个文件中提取的文本中每个字母的出现次数。我还没有做得太深入,我只是对字母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
python typeerror traceback
1个回答
0
投票

我是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
投票
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
投票

我想你是想自己一步一步的学习.所以我没有给你一个现成的解决方案,但我纠正了两个错误。

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' 或 letter == 'A'。

你可以将前两个for循环简化为一个。

for line in file:
    for letter in line:

0
投票

这就是我现在的情况... So this is where I'm at right now... 我为每个字母做了一个这样的循环......它只带回了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
投票

即使有了 马西莫的 修正,你将无法将一个计数分配给一个全局变量,(A-Z定义在函数之外)。然而有一个方法可以做到这一点,只需声明 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])

更新2:

刚刚发现我没有按照你的方法来做。在这里,你会注意到只有一个函数是以字母为参数的,而不是为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个字母的行数,而不是读取文件中的第一个字母。

当我在学校的时候,我们要做一个单词搜索谜题,在8个方向中的1个方向(N,NE,E,SE,S,......)上找到单词,我为这8个方向分别创建了一个函数。

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

希望按照你的方法做的这个例子对你有帮助。(只是说没有必要创建26个函数,当一个函数就可以了)

© www.soinside.com 2019 - 2024. All rights reserved.