计算文件的字母数并创建直方图

2024-03-29 09:45:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一些帮助来解决我面临的问题

我试图读取一个文本文件,使用字典计算文件中每个字母出现的次数

大写字母转换为小写字母,只计算英语中的a-z。然后从计数中显示如下星形柱状图,并打印字母总数的计数

我让第一部分工作,计算每个字母在文件中出现的次数,直到我添加直方图代码

我没有收到错误,但终端在运行时仅显示以下内容:

{'d': 1}

我目前的代码是:

def LetterCount(file_path):
    file_path = file_path.lower().translate(file_path)
    file_path = file_path.translate(string.punctuation)
    file_path = file_path.strip(string.punctuation + string.whitespace)
    list1=list(file_path)
    lcDict= {}
    with open(file_path,'r') as f:
        for l in list1:
            if l.isalpha():
             if l in lcDict:
                  lcDict[l] +=1
             else:
                    lcDict[l]= 1
                    return lcDict
file_path = '/myfolder/text.txt'
if __name__ == "__main__":
    print(LetterCount(file_path))




def histogram(file_path):
    sumValues = LetterCount(file_path)
    padding = max(len(sumValues), len('Element'))
    padding1 = max(len(str(max(sumValues))), len('Value')) 
    print("\nCreating a histogram from values: ")
    print("%s %10s %10s" %("Element", "Value", "Histogram"))
    for i,n in enumerate(sumValues, start=1):
        ('{0} {1}     {2}'.format( 
              str(i).ljust(padding), 
              str(i).rjust(padding1), 
              '*'*n))
print(histogram(file_path) 

我想从柱状图中得到的是

a | *****
b | ***
c | ******
d | ****
e | *******
f | **
h | ***** 
...
z | *      

如果有任何帮助,我将不胜感激


Tags: 文件pathinstringlenif字母max
2条回答

您可以使用一些标准库来让您的生活更轻松

import collections
import re

# Open the file
with open("./file.txt", 'r') as f:
    txt = f.read()

# Find all the alphabetic characters
letters = re.findall("[a-zA-Z]", txt)
# Count them
counts = collections.Counter(letters)

# Print the star histogram
for i in 'abcdefghijklmnopqrstuvwxyz':
    if i in counts:
        print(f"{i} | {'*' * counts[i]}")
    else: print(f"{i} | ")

因为我没有你的文件,也无法复制你的具体例子,所以我会分开回答这两个问题

首先,为了为您的文件(表示为字符串列表)创建直方图作为字典,请遵循以下代码部分:

list_of_sentences = ["this is my first code in python", "it's rainy today", "thanks"]

m_dict = {}
for sentence in list_of_sentences:
    for letter in sentence:
        if letter.isalpha():
            if letter in m_dict.keys():
                m_dict[letter]+= 1
            else:
                m_dict[letter] =1
print(m_dict)

输出:

{'t': 6, 'h': 3, 'i': 6, 's': 5, 'm': 1, 'y': 4, 'f': 1, 'r': 2, 'c': 1, 'o': 3, 'd': 2, 'e': 1, 'n': 4, 'p': 1, 'a': 3, 'k': 1}

上面的方法将迭代文件中的字母并计数,如果您想迭代az,那么对于大文件将非常有效(此外,它还将打印文件中不存在的字母),您最好使用以下方法:

for code in range(ord('a'), ord('z') + 1):
    m_dict[chr(code)] = ''.join(list_of_sentences).count(chr(code))

输出:

{'t': 6, 'h': 3, 'i': 6, 's': 5, 'm': 1, 'y': 4, 'f': 1, 'r': 2, 'c': 1, 'o': 3, 'd': 2, 'e': 1, 'n': 4, 'p': 1, 'a': 3, 'k': 1, 'b': 0, 'g': 0, 'j': 0, 'l': 0, 'q': 0, 'u': 0, 'v': 0, 'w': 0, 'x': 0, 'z': 0}

现在,当我们手中有了柱状图(让我们继续第一个柱状图),让我们按照您的意愿面对格式化柱状图的第二部分:

def print_as_histogram(m_dict):
    for letter in sorted(m_dict.keys()):
        print(f'{letter} | {"*"*m_dict[letter]}')

print_as_histogram(m_dict)

输出:

a | ***
c | *
d | **
e | *
f | *
h | ***
i | ******
k | *
m | *
n | ****
o | ***
p | *
r | **
s | *****
t | ******
y | ****

把信分类,因为在我看来它看起来更好

相关问题 更多 >