在Python中制作直方图

时间:2015-01-13 00:17:40

标签: python python-3.x

我一直在尝试使用下面survey中给出的数据制作直方图。

#represents the "information" (the summarized data)
ranking = [0,0,0,0,0,0,0,0,0,0,0]
survey = [1,5,3,4,1,1,1,2,1,2,1,3,4,5,1,7]

for i in range(len(survey)):
    ranking[survey[i]]+=1

#create histogram
print("\nCreating a histogram from values: ")
print("%3s %5s %7s"%("Element", "Value", "Histogram"))
for i in range(len(ranking)):
    print("%7d %5d %-s"%(i+1, ranking[i+1], "*" * ranking[i+1]))

以下是我运行代码时shell显示的内容:

Creating a histogram from values: 
Element Value Histogram
      1     7 *******
      2     2 **
      3     2 **
      4     2 **
      5     2 **
      6     0 
      7     1 *
      8     0 
      9     0 
     10     0 
Traceback (most recent call last):
  File "C:\folder\file23.py", line 17, in <module>
    print("%7d %5d %-s"%(i+1, ranking[i+1], "*" * ranking[i+1]))
IndexError: list index out of range

我的预期输出就是没有追溯的上述事情。

shell正在显示正确的内容,我只是不确定错误消息。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

i达到最高值len(ranking) - 1时,您对ranking[i+1] 的使用明显“超出范围”!在range(len(ranking) - 1循环中使用for可以避免错误。

计数也可以简化:

import collections
ranking = collections.Counter(survey)

for i in range(min(ranking), max(ranking)+1):
    print("%7d %5d %-s"%(i, ranking[i], "*" * ranking[i]))

您需要minmax,因为Counter是类似映射的,而不是序列式的。但它仍然可以正常工作(如果您愿意,可以使用range(0, max(ranking)+1)! - )

答案 1 :(得分:0)

您的索引i会增加到len(ranking)-1,这是ranking中的最后一个有效索引,但您尝试访问ranking[i+1],因此IndexError 1}}。

修正:

for i in range(len(ranking)-1):