我一直在尝试使用下面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正在显示正确的内容,我只是不确定错误消息。我该如何解决这个问题?
答案 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]))
您需要min
和max
,因为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):