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



我正在寻求解决我面临的问题的帮助。

我试着阅读一个文本文件,用字典计算文件中每个字母的出现次数。

大写字母被转换成小写字母,只有英语中的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 | *      

我将非常感谢的任何帮助

因为我没有您的文件,也无法重现您的具体示例,所以我将分别回答这两个问题。

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

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

对信件进行了排序,因为在我看来看起来更好

您可以使用一些标准库来简化您的生活!

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

最新更新