python程序中的逻辑错误

时间:2016-02-23 20:27:31

标签: python python-2.x

alphabets ="abcdefghijklmnopqrstuvwxyz"
def calculation(text,alphabets):
    sample_list = []
    total_counter = 0
    for element in text:
        if element != " ":
            total_counter += 1
    total = total_counter

    for alphabet in alphabets:
        alphabet_counter = 0
        for element in text:
            if element == alphabet:
                alphabet_counter += 1
        tna = alphabet_counter
        percentage_counter = float((tna/total)*100)
        sample_list.append(percentage_counter)
    return sample_list

text = "sahib will be a very successful programmer one day."

x = calculation(text,alphabets)
print x

我试图创建一个python程序员来计算文本中每个字符的百分比。但是当我打印列表时,它会显示一个空列表

5 个答案:

答案 0 :(得分:4)

我认为这一行:

percentage_counter = float((tna/total)*100)

正在进行整数数学运算,从而导致所谓的“地板划分”与结果混淆。 尝试替换为:

percentage_counter = 100*tna/float(total)

答案 1 :(得分:1)

这不是您的问题的答案(因为user2464424已经回答了它),但只是一些未来的提示。你的功能可以更加简洁地表达出来:

def calculation(text, alphabet):
    total = float(sum(ch in alphabet for ch in text))
    return [100 * sum(ch == letter for ch in text) / total for letter in alphabet]

这演示了Python的list comprehensiongenerator expressions以及布尔值are integers的事实。

它还修复了程序中的一个错误,即总字符数只排除空格而不是句点,而此版本排除了给定字母表中未明确显示的所有字符。 (当前函数返回的列表不总和为100.)

答案 2 :(得分:0)

您可以使用Counter()OrderedDict()和正则表达式极大地简化您的问题。正则表达式删除所有不是A-Z的字符,Counter获取每个字母的出现次数,OrderedDict允许您按顺序打印字母。

from collections import Counter, OrderedDict
import re

string= 'sahib will be a very successful programmer one day.'.lower()

string = re.sub('[^a-z]', '', string)

count = Counter(string)
count = OrderedDict(sorted(count.items()))

for k,v in count.items():
    print "{} {:.2f}".format(k, (v/float(len(string))*100))


a 9.52
b 4.76
c 4.76
d 2.38
e 11.90
f 2.38
g 2.38
h 2.38
i 4.76
l 7.14
m 4.76
n 2.38
o 4.76
p 2.38
r 9.52
s 9.52
u 4.76
v 2.38
w 2.38
y 4.76

答案 3 :(得分:0)

我将结束部分更改为:

x = calculation(text,alphabets)
for val in x:
    print("%5.2f"%val)

并得到一个开始的列表:

 9.30
 4.65
 4.65
 2.33
11.63
 2.33
 2.33

我可以建议,如果你用这个百分比存储这封信会更有意思吗?试试我的版本:

alphabets ="abcdefghijklmnopqrstuvwxyz"
def calculation(text,alphabets):
    sample_dict = {}
    total_counter = 0
    for element in text:
        if element != " ":
            total_counter += 1
    total = total_counter

    for alphabet in alphabets:
        alphabet_counter = 0
        for element in text:
            if element == alphabet:
                alphabet_counter += 1
        tna = alphabet_counter
        percentage_counter = float((tna/total)*100)
        sample_dict[alphabet]=(percentage_counter)
    return sample_dict

text = "the quack frown sox lumps oven the hazy fog"

x = calculation(text,alphabets)
for key,val in sorted(x.items()):
    print("%s"%key,"%5.2f"%val)

这会产生一个开始的列表:

a  5.71
b  0.00
c  2.86
d  0.00
e  8.57
f  5.71
g  2.86
h  8.57
i  0.00

看看你的想法。

答案 4 :(得分:0)

哦,简单来说就试试打印浮点数(tna / total)。你将得到0,因为输出0(仅整数)内的值和浮点数0只是0.0。

所以这是你可以做的 - 在执行tna / total之前将tna或total中的一个转换为浮点数。 像tna * 1.0000 /总计。 这种方式有效。 干杯