Печать гистограммы - PullRequest
       22

Печать гистограммы

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

У меня есть список целочисленных процентов, которые мне нужно распечатать, используя следующий шаблон:

The index of a value, a tab (8 spaces), a '*' printed for each percentage point

также, если значение индекса равно 0, выведите «меньше 1»процентов '

Я пробовал этот код:

for b in new_tally:
    if b > 0:
        print new_tally[b], \t, '*' * b
    else:
        print 'Less than 1% of words had this length'

Однако я продолжаю получать код ошибки: список индекса выходит за пределы диапазона.

Я вообще не понимаю, этоКто-нибудь может указать, что я сделал неправильно?

Ответы [ 3 ]

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

Я думаю, что код, который вы хотели, был:

>>> new_tally = [5, 7, 8, 6, 4, 2]
>>> for i, b in enumerate(new_tally, 1):
        print i, ':', b, '*' * b

1 : 5 *****
2 : 7 *******
3 : 8 ********
4 : 6 ******
5 : 4 ****
6 : 2 **

Причиной первоначальной трассировки является то, что элементы списка ищутся с использованием квадратных скобок вместо скобок. new_tally(i) - это вызов функции. new_tally[i] является индексированным поиском.

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

первая часть:

new_tally = [5, 7, 8, 6, 4, 2]
for b in new_tally:
    print b

вторая часть:

new_tally = [5, 7, 8, 6, 4, 2]
for i in range(len(new_tally)):
    print i, new_tally[i]

вышеупомянутые два делают примерно одно и то же.вы путаете между посещением элементов в последовательности (первый подход) и доступом к элементам списка по последовательному индексу (второй подход).

0 голосов
/ 02 ноября 2011
for key,val in new_tally.iteritems():
    print('{k} {a}'.format(k=key,a='*'*int(val)))

или, если вы хотите, чтобы гистограмма сортировалась в порядке убывания частоты:

import operator
for key,val in sorted(new_tally.items(),key=operator.itemgetter(1),reverse=True):
    print('{k} {a}'.format(k=key,a='*'*int(val)))
...