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)
我的代码中存在错误,因此我可以实现目标。
答案 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
中的正确索引。