मैं छवियों की एक श्रृंखला को बेतरतीब ढंग से प्रदर्शित करने की कोशिश कर रहा हूं लेकिन मैं छवियों को दोहराने से बचना चाहता हूं।

नीचे दिया गया कोड स्टार्टअप पर काम करता है लेकिन एक समय आता है जब निम्न त्रुटि बस दिखाई देती है:

पॉप इंडेक्स सीमा से बाहर है

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 अक्टूबर 2020, 18:53

1 उत्तर

सबसे बढ़िया उत्तर

.pop() वास्तव में वापस लौटता है और सूची के अंतिम तत्व sufijos_png को हटा देता है, इसलिए उपरोक्त तर्क के साथ, यह संभव है कि किसी बिंदु पर यह इंडेक्स पर तत्व को हटाने का प्रयास करेगा n_img-1 सूची से 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

फिर हम sufijos_png की स्थिति n_img-1 = 9-1 = 8 पर मान को पॉप (+ रिटर्न) करते हैं।

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)
    )
0
tania 27 अक्टूबर 2020, 19:18