Próbuję wyświetlić losowo serię obrazów, ale chcę uniknąć powtarzania obrazów.

Kod poniżej działa na uruchomieniu, ale pojawia się czas, gdy pojawia się następujący błąd:

indeksu pop poza zakresem

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?
0
Diego Montaña 27 październik 2020, 18:53

1 odpowiedź

Najlepsza odpowiedź

.pop() faktycznie powraca i Usuwa Ostatni element listy sufijos_png, więc z powyższym logiką możliwe jest, że w pewnym momencie spróbuje usunąć element w indeksie { {X2}} z listy sufijos_png, która już nie istnieje. Aby zademonstrować, weźmy przykład, który dałeś:

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

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

Zauważ, że len(sufijos_png) = 10. Teraz, pierwszy raz losowo wybieramy wartość z sufijos_png. Powiedzmy, że wartość jest 9, więc

n_img = random.choice(sufijos_png)
n_img
9

Następnie pop (+ powrót) wartość na pozycji n_img-1 = 9-1 = 8 sufijos_png.

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

Teraz wyobraź sobie następny losowy rysunek z {X0}} jest równy 10 (to jedna z wartości nadal pozostała tam). Jednak długość sufijos_png jest teraz 9, więc zakres indeksu wynosi 0-8. Dlatego poniżane podniosą 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

Jednym ze sposobów na pokonanie tego problemu, zakładając, że po prostu potrzebujesz losowej liczby, która nie powtarza się, aby przypisać do self.player.n_loteria = n_img, ma wygenerować listę cyfr / wartości, a następnie shuffle je, a następnie Trzymaj się z tej losowo uporządkowanej listy. Na przykład:

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)
    )
0
tania 27 październik 2020, 16:18