Python listindex超出简单for循环的范围(骰子概率)
我是编程新手,所以我无法理解为什么我的代码的这一部分不起作用。 当n=35时,n=30。所以错误是“列表索引超出范围”,尽管我已经设置了范围和计数6。 为什么?我该如何解决这个问题 当这部分代码单独运行时,不会出现任何问题。但当它与我的其余代码一起运行时,它会出现“列表索引超出范围”错误。。。 这是我的完整代码中唯一出现错误的部分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
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)]