在 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]))
这里需要 min
和 max
因为 Counter
是映射类的,而不是序列类的。但它仍然可以正常工作(如果你愿意,你 可以 使用 range(0, max(ranking)+1)
!-)
我一直在尝试使用下面 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]))
这里需要 min
和 max
因为 Counter
是映射类的,而不是序列类的。但它仍然可以正常工作(如果你愿意,你 可以 使用 range(0, max(ranking)+1)
!-)