簡體   English   中英

嘗試計算文件中每個字母的出現次數時出錯

[英]Getting error trying to count occurences of each letter from file

我正在嘗試創建一個程序來計算從另一個文件中提取的文本中每個字母的出現次數。 我還沒有走得太遠,我剛剛對字母 A 進行了第一次測試,無法進一步測試 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

我想你想自己學習,一步一步來。 所以我沒有給你一個現成的解決方案,但我糾正了兩個錯誤:

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- 循環簡化為一個:

for line in file:
    for letter in line:

我是 python 的新手,所以如果我錯了不要怪我:))

  1. 我認為您的變量超出了 scope。

嘗試這個。

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

這是您問題的完整代碼。 您不必制作 function 來計算每個字母。

即使使用Massimo 的更正,您也無法將計數分配給全局變量(AZ 在函數外部定義)。 但是有一種方法可以做到這一點,只需在 function 中聲明global A 但是您可能不希望所有 26 個字母都使用這個。

collections 中有一個方便的function ,稱為Counter ,它將獲取字符串(或任何文本體)中的字母數。

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)

雖然,沒有真正需要 function 來計算字母:

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 個 function 將一個字母作為參數,而不是 26 個字母中的每一個都使用不同的 function。

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 個字母的行,而不是讀取文件中的第一個字母。

當我在學校時,我們必須做一個單詞搜索拼圖,其中單詞可以在八個方向中的一個(N,NE,E,SE,S,...)中找到,我為每個方向創建了一個 function 8個方向。

但是,現在我發現最好只創建一個 function 並將方向作為參數傳遞給 function 和 function 內部,以傳遞的方向行駛。

希望這個遵循您的方法的示例對您有所幫助。 (只是說不需要創建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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM