Проценты и округления в Python - PullRequest
0 голосов
/ 02 ноября 2011

У меня есть код, который создает список процентного содержания определенных длин слов в текстовом файле, например, 1-буквенные слова появляются в 13% случаев, мне было интересно, было ли 1-буквенное слово в 50 000 слов текстафайл, будет ли округлять процент для двадцати буквенных слов до 0 или до 1?

вот весь код:

lines = open ('E:\Videos, TV etc\Python\Assessment\dracula.txt', 'r'). readlines ()

stripped_list = [item.strip() for item in lines]

tally = [0] * 20

print tally #original tally

for i in stripped_list:
    length_word = int(len(i))
    tally[length_word-1] += 1 #adds 1 to the tally for the index of that word length, (length_word)-1 used as the tally for 1 letter words are in the 0 index
print tally

new_tally = [] #this tally will contain the occurences of each word length by percentage
for a in tally:
    new_tally.append((100*a)/(sum(tally))) # multiplies by 100 and divides by all of the tallies to give a percentage
print new_tally

Ответы [ 4 ]

3 голосов
/ 02 ноября 2011

По умолчанию вы получили усеченное число, если числитель и знаменатель являются целыми числами.

>>> 1 / 50000
0

Чтобы обойти и реальный процент, вы меняете одно или оба значения на число с плавающей точкой

>>> 1.0 / 50000
2e-05

А если вы говорите о переменных,

>>> cnt, all = 1, 50000
>>> float(cnt) / all
2e-05

умножьте 100, чтобы получить процент.

2 голосов
/ 02 ноября 2011

Ваш код использует целочисленное деление по полу, которое всегда округляется до нуля.

Получите больше контроля с помощью деления с плавающей запятой и встроенной функции Python's round () :

percentage = round((100.0*a) / sum(tally))
2 голосов
/ 02 ноября 2011

Будет округлено до 0.

2 голосов
/ 02 ноября 2011

Если вы используете int (), то Python всегда округляется.int (0.99999) = 0. Это буквально просто отбрасывание детали после десятичной дроби.

Если вы хотите что-то более похожее на то, что большинство людей подразумевают под округлением, вы можете сделать: "% 0.0f"% (yourval,).

Использует алгоритм, имя которого ускользает от меня, где числа точно в среднем раунде приближаются к ближайшему четному числу, поэтому 0,5 становится 0, но 1,5 становится 2. 0,49 всегда0, а 0,51 всегда равно 1.

...