Python listindex超出简单for循环的范围(骰子概率)

Python listindex超出简单for循环的范围(骰子概率),python,list,dice,Python,List,Dice,我是编程新手,所以我无法理解为什么我的代码的这一部分不起作用。 当n=35时,n=30。所以错误是“列表索引超出范围”,尽管我已经设置了范围和计数6。 为什么?我该如何解决这个问题 当这部分代码单独运行时,不会出现任何问题。但当它与我的其余代码一起运行时,它会出现“列表索引超出范围”错误。。。 这是我的完整代码中唯一出现错误的部分 count6 = [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 2

我是编程新手,所以我无法理解为什么我的代码的这一部分不起作用。 当n=35时,n=30。所以错误是“列表索引超出范围”,尽管我已经设置了范围和计数6。 为什么?我该如何解决这个问题

当这部分代码单独运行时,不会出现任何问题。但当它与我的其余代码一起运行时,它会出现“列表索引超出范围”错误。。。 这是我的完整代码中唯一出现错误的部分

count6 = [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
freq = 10
dice = random.randrange(1,7)

print('\nProbability for 6 dices:')
for n in range(5, 36):
   percentage_6 = (count6[n - 5] / freq) * 100
   procent_6 = str(percentage_6)
   print('this is n:', n)
   print(n + 1, ':', procent_6, '%')

该列表仅包含31个数字,您可以从0到30中进行选择: 应该是:

for n in range(0, 30):
或者(更好):


这些数字是索引,而不是值本身。

您发布的代码不会产生索引外错误,因此我认为您在代码中的某个地方使用了count6[n]。 您可以使用索引而不是值本身来访问列表的值

count6 =[6, 7, 8, 9, ...  35, 36]
#index   0  1  2  3  ...  29  30
因此,当n达到
count6[31]
的值时,您试图找到列表中不存在的第32个元素(因为索引从0开始),因为列表只有31个元素(索引为0的元素是第一个元素),如上所示

即使情况并非如此,如果可能的话,也应该选择更具pythonic风格的选项并使用index来代替循环

for i in count6:
    percentage_6 = (i / freq) * 100
    ...
或者你可以简单地使用

for i in range(6, 37):
    percentage_6 = (i / freq) * 100
    ...
如果你必须使用这样的列表,我建议你使用列表理解

count6 = [number for number in range(6, 37)]

我解决了。错误发生在我稍后在代码中调用count6并在rolled6处停止时。count(30)(rolled6是我的6个骰子的滚动总和列表)

我改变了它,使它包含31,32…36也

count6 = [rolled6.count(6), rolled6.count(7), rolled6.count(8), rolled6.count(9), rolled6.count(10), rolled6.count(11),
          rolled6.count(12), rolled6.count(13), rolled6.count(14), rolled6.count(15), rolled6.count(16),
          rolled6.count(17), rolled6.count(18), rolled6.count(19), rolled6.count(20), rolled6.count(21),
          rolled6.count(22), rolled6.count(23), rolled6.count(24), rolled6.count(25), rolled6.count(26),
          rolled6.count(27), rolled6.count(28), rolled6.count(29), rolled6.count(30), rolled6.count(31), rolled6.count(32), rolled6.count(33), rolled6.count(34), rolled6.count(35), rolled6.count(36)]

您发布的代码没有产生索引错误,存在名称错误(因为
freq
未定义),但如果修复了,代码运行正常。我看到您修复了名称错误,但新代码仍然不会产生任何错误(只要添加了
import random
).这很奇怪,因为这部分代码单独使用时不会出现问题。当它与我的完整代码在一起时,会引发错误吗?这是我完整代码中唯一存在问题的部分。这就是为什么你应该总是发布一个。我的错,你是对的。我会改变它,但是:
len(list(range(5,36))==31
。这两个语句并不等同于@ekhumero所指出的,如果OP正在使用,他应该从
count6[n-5]
中删除
-5
,是的,更重要的是:OP的范围显然已经正常工作了。因此,更改
n
的生成方式并不能解决任何问题。我的猜测是OP的真实代码在执行for循环之前的某个时间点覆盖/修改
count6
。这可以解释为什么问题中的代码运行时没有错误(即,
count6
被重新初始化)。
count6 = [rolled6.count(6), rolled6.count(7), rolled6.count(8), rolled6.count(9), rolled6.count(10), rolled6.count(11),
          rolled6.count(12), rolled6.count(13), rolled6.count(14), rolled6.count(15), rolled6.count(16),
          rolled6.count(17), rolled6.count(18), rolled6.count(19), rolled6.count(20), rolled6.count(21),
          rolled6.count(22), rolled6.count(23), rolled6.count(24), rolled6.count(25), rolled6.count(26),
          rolled6.count(27), rolled6.count(28), rolled6.count(29), rolled6.count(30),]
count6 = [rolled6.count(6), rolled6.count(7), rolled6.count(8), rolled6.count(9), rolled6.count(10), rolled6.count(11),
          rolled6.count(12), rolled6.count(13), rolled6.count(14), rolled6.count(15), rolled6.count(16),
          rolled6.count(17), rolled6.count(18), rolled6.count(19), rolled6.count(20), rolled6.count(21),
          rolled6.count(22), rolled6.count(23), rolled6.count(24), rolled6.count(25), rolled6.count(26),
          rolled6.count(27), rolled6.count(28), rolled6.count(29), rolled6.count(30), rolled6.count(31), rolled6.count(32), rolled6.count(33), rolled6.count(34), rolled6.count(35), rolled6.count(36)]