在 Python 中制作直方图

Making a histogram in Python

我一直在尝试使用下面 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 显示正确的内容,我只是不确定错误消息。我该如何解决这个问题?

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

修复:

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

i达到最高值len(ranking) - 1时,你对ranking[i+1]的使用显然是"out of range"!在 for 循环中使用 range(len(ranking) - 1 以避免错误。

计数也可以简化:

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)!-)