text.count函数不起作用

时间:2016-05-09 00:36:40

标签: python function

我是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,'%')

如果我不够清楚,我可以提供更多信息,因为我不知道问题是什么。

3 个答案:

答案 0 :(得分:0)

您认为发生这种情况的原因是('a' and 'A')的行为与预期不符:

>>> ('a' and 'A')
'A'
>>> 'abfaAHA'.count('a' and 'A')
2

and评估第一个参数a,如果这是真实的,那么它会自动返回第二个参数。由于所有非空字符串都是真实的Acount返回并使用。为了计算aA的所有匹配项,请单独检查它们或将字符串转换为小写并检查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))