我是Python的新手,我正在尝试创建一个频率分析程序,该程序可以告诉您字母在文本中出现的频率。我在字母表中的每个字母都是一个变量,所有这些都在一个名为“freq_analysis”的函数中。它使用参数' text',所以它们都可以单独打印和计算,每个变量都是这样的:
a = text.count('a' and 'A')
每个变量都与之相同。除了字母不同之外,就是这样。我确保每条线上都没有反引号或空格。然后我创建了单独的变量,其中计算了百分比(文本中出现的每个字母的频率),如下所示:
aa = (a / (len(text) - blank)) * 100
再次,我检查了每个变量是否相同。问题在于,当我尝试打印每个百分比时,计算和打印的唯一百分比是字母T的百分比。这甚至不包括小写字母t,它只是大写字母T我通过调用函数并运行文本来测试这个问题' tttTtt'通过它。返回的百分比为16.66,而不是100,这应该是应该的。我使用以下代码打印每个字母:
print (aa,'%')
如果我不够清楚,我可以提供更多信息,因为我不知道问题是什么。
答案 0 :(得分:0)
您认为发生这种情况的原因是('a' and 'A')
的行为与预期不符:
>>> ('a' and 'A')
'A'
>>> 'abfaAHA'.count('a' and 'A')
2
and
评估第一个参数a
,如果这是真实的,那么它会自动返回第二个参数。由于所有非空字符串都是真实的A
由count
返回并使用。为了计算a
和A
的所有匹配项,请单独检查它们或将字符串转换为小写并检查a
:
>>> s = 'abfaAHA'
>>> s.count('a') + s.count('A')
4
>>> s.lower().count('a')
4
由于您想知道使用Counter
的所有字母的计数会使任务变得更容易。它从字符串创建一个字典对象,其中键是字母,值是计数:
>>> from collections import Counter
>>> Counter(s.lower())
Counter({'a': 4, 'h': 1, 'b': 1, 'f': 1})
答案 1 :(得分:0)
我认为你在第一个例子中寻找的是:
a = text.count('a') + text.count('A')
说明:表达式text.count('a' and 'A')
始终解析为text.count('A')
,因为'a' and 'A'
为'A'
。和运算符尝试两个操作数作为真值,并返回第一个非真值,如果它们都是真实的,则返回最后一个值。
答案 2 :(得分:0)
其他人已经解释了使用text.count('a' and 'A')
的问题。
由于您希望频率不区分大小写,因此您可以将传入的文本首先转换为小写(如果您愿意,则转换为大写),然后执行计数。在函数顶部转换为小写:
def f(text):
text = text.lower()
a = text.count('a')
b = text.count('b')
...
然而,这并不理想。你将最终得到26个变量,这些变量将很快变得笨拙。您最好使用字典来维护每个字符的计数,或者您可以快捷方式并直接转到collections.Counter
对象为您完成所有操作:
from collection import Counter
text = 'Hi there!'
counts = Counter(text.lower())
print(counts)
# Counter({'e': 2, 'h': 2, '!': 1, ' ': 1, 'i': 1, 'r': 1, 't': 1})
现在,您拥有counts
中每个角色的计数。它提供了一个类似于字典的界面,所以:
>>> counts['a']
0
>>> counts['e']
2
因为您要忽略非字母字符,可以使用string.ascii_lowercase
过滤掉这些不需要的字符:
text = 'Hi there!'
counts = Counter(c for c in text.lower() if c in string.ascii_lowercase)
现在计数中没有'!'
。
计算百分比:
n_letters = len(list(counts.elements()))
for c in sorted(counts):
print('{}: {:.2f}'.format(c, counts[c] / n_letters * 100))
e: 28.57
h: 28.57
i: 14.29
r: 14.29
t: 14.29
如果你想要所有的信件:
n_letters = len(list(counts.elements()))
for c in string.ascii_lowercase:
if c in counts:
frequency = counts[c] / n_letters * 100
else:
frequency = 0
print('{}: {:.2f}'.format(c, frequency))