Python 计算文件的字母数并创建直方图
我正在寻找一些帮助来解决我面临的问题 我试图读取一个文本文件,使用字典计算文件中每个字母出现的次数 大写字母转换为小写字母,只计算英语中的a-z。然后从计数中显示如下星形柱状图,并打印字母总数的计数 我让第一部分工作,计算每个字母在文件中出现的次数,直到我添加直方图代码 我没有收到错误,但终端在运行时仅显示以下内容:Python 计算文件的字母数并创建直方图,python,file,dictionary,Python,File,Dictionary,我正在寻找一些帮助来解决我面临的问题 我试图读取一个文本文件,使用字典计算文件中每个字母出现的次数 大写字母转换为小写字母,只计算英语中的a-z。然后从计数中显示如下星形柱状图,并打印字母总数的计数 我让第一部分工作,计算每个字母在文件中出现的次数,直到我添加直方图代码 我没有收到错误,但终端在运行时仅显示以下内容: {'d': 1} 我目前的代码是: def LetterCount(file_path): file_path = file_path.lower().translate
{'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}
{'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}
a | ***
c | *
d | **
e | *
f | *
h | ***
i | ******
k | *
m | *
n | ****
o | ***
p | *
r | **
s | *****
t | ******
y | ****
上述方法将迭代文件中的字母,并对它们进行计数,如果您想迭代a
到z
,那么对于大文件将非常有效(此外,它还将打印文件中不存在的字母),您最好使用以下方法:
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}
{'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}
a | ***
c | *
d | **
e | *
f | *
h | ***
i | ******
k | *
m | *
n | ****
o | ***
p | *
r | **
s | *****
t | ******
y | ****
现在,当我们手中有了柱状图(让我们继续第一个柱状图),让我们按照您的意愿面对格式化柱状图的第二部分:
def print_as_histogram(m_dict):
for letter in sorted(m_dict.keys()):
print(f'{letter} | {"*"*m_dict[letter]}')
print_as_histogram(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}
{'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}
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} | ")
有一件事,如果这封信出现了0次,你想让这封信不带星星打印,还是跳过这封信?我更希望它打印出来,但不带星星。当你在程序中的不同位置打印内容时,你看到它可能会出问题了吗?如果您现在正在使用IDE,那么现在正是学习其调试功能的好时机,例如设置断点和检查值。或者你可以花一点时间熟悉内置的。此外,在你的计划中的战略点上打印资料可以帮助你追踪正在发生或没有发生的事情。请提供预期的结果。显示中间结果与预期结果的偏差。我们应该能够将单个代码块粘贴到文件中,运行它,并重现您的问题。您的大部分代码处理读取文件;很多是关于显示机制的。很多都是关于信件的计数。哪一部分有问题?你的代码不是最小的,它无法运行有几个原因。哇,这比我拥有的要干净得多,非常感谢。这会忽略非英语单词还是我必须使用类似于s.ascii的东西。lower
isalpha
将返回True
仅用于a
到z
的字母,请注意编辑,以便计算除已在文件中的字母以外的其他字母