def countchar()在一个句子中查找字母的频率

时间:2016-10-28 12:40:19

标签: python-2.7

def countchar(str):
    list1 = [0]*26
    for i in range(0,len(str)):
        if (str[i] >= 'a' and str[i] <='z'):  
            ***list1[ord(str[i])-0] += 1***
    print list1
if __name__ == "__main__":
str = " GOOD morning and have a nice day"
str = str.lower()
print countchar(str)

我的代码中存在错误,因此我可以实现目标。

1 个答案:

答案 0 :(得分:0)

您的主要问题是您需要从每个字符中减去ord("a")(即97),以便在list1中找到其索引,而不是0

但是我也清理了其余的代码,因为还有很多其他低效率和不良做法以及其他内容。

def countchar(sentence):
    list1 = [0 for i in range(26)]

    for c in sentence:
        if 'a' <= c <= 'z':
            list1[ord(c) - ord("a")] += 1
    return list1

if __name__ == "__main__":
    string = " GOOD morning and have a nice day"
    string = string.lower()
    print countchar(string)

特别是,使用str等关键字作为变量名称是不好的做法。

此外,根据您计划对此进行的操作,dictionary可能会比列表更适合您的用途。

这是一个快速重写(使用附加功能,它将使用字典计算所有字符,而不仅仅是小写字母):

def countchar(sentence):
    char_dict = {}

    for c in sentence:
        if c in char_dict:
            char_dict[c] += 1
        else:
            char_dict[c] = 1
    return char_dict

if __name__ == "__main__":
    string = " GOOD morning and have a nice day!!"

    print "With uppercase (and punctuation, etc):"
    print countchar(string)

    print "All lowercase (and punctuation, etc):"
    string = string.lower()
    print countchar(string)

根据评论中的要求,以下是对以下内容的一些澄清:

list1[ord(c) - ord("a")] += 1

首先让我们看一下内部ord(c) - ord("a")c是一个只包含单个字符的字符串,因此ord(c)为您提供该字符串的ASCII值。由于您将小写字母映射到数字0,1,...,25,我们需要确保字母“a”映射到0.因为,在ASCII中,字母是顺序的(a = 97, b = 98,...,z = 122),然后我们可以从每个中减去最小的一个以映射它们:

a --> 97-97 = 0
b --> 98-97 = 1
c --> 99-97 = 2
...
z --> 122-97 = 25

这就是ord(c) - ord("a")正在做的事情。它从每个值中减去97(这是ord("a")的值),并给出0到25之间的数字。

然后list1[ that number between 0 and 25 ] += 1只会增加list1中的正确索引。