0

我正在尝试随机显示一系列图像,但我想避免重复图像。

下面的代码在启动时有效,但有时会出现以下错误:

弹出索引超出范围

sufijos_png = list(range(1, 10+1))

def vars_for_template(self):
    n_img = random.choice(sufijos_png)
    self.player.n_loteria = n_img
    sufijos_png.pop(n_img-1)
    return dict(
        image_path='dict/G{}.png'.format(n_img)
    )´

Anyone have any idea how to fix this error?
4

1 回答 1

0

.pop()实际上返回并删除了 list 的最后一个元素sufijos_png,因此按照上面的逻辑,它可能会在某个时候尝试n_img-1从 list中删除 index 处的元素,而该元素sufijos_png不再存在。为了演示,让我们以您给出的示例为例:

sufijos_png = list(range(1, 10+1))
sufijos_png

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

注意len(sufijos_png)= 10。现在,我们第一次从 中随机选择一个值sufijos_png。假设值是9,所以

n_img = random.choice(sufijos_png)
n_img
9

然后我们弹出(+返回)位置的n_img-1 = 9-1 = 8sufijos_png

sufijos_png.pop(n_img-1) # pops value at index position 8
sufijos_png
[1, 2, 3, 4, 5, 6, 7, 8, 10]

现在,想象下一个随机抽取sufijos_png等于 10(它是仍然保留在那里的值之一)。但是,现在的长度sufijos_png是 9,所以索引范围是 0-8。因此,以下将引发IndexError

n_img = random.choice(sufijos_png)
n_img
10 # one of the remaining possible values in sufijos_png

sufijos_png.pop(n_img-1) # pops value at index position 10, which doesn't exist

IndexError: pop index out of range

克服这个问题的一种方法,假设您只需要一个不重复的随机数来分配给self.player.n_loteria = n_img,是生成一个数字/值列表,然后生成shuffle它们,然后从这个随机排序的列表中不断弹出。例如:

import random
sufijos_png = list(range(1, 10+1))
random.shuffle(sufijos_png) # just need to shuffle once

def vars_for_template(self):
    n_img = sufijos_png.pop() # every time you accessing, you're depleting the list
    self.player.n_loteria = n_img
    return dict(
        image_path='dict/G{}.png'.format(n_img)
    )
于 2020-10-27T16:12:32.490 回答