मैं छवियों की एक श्रृंखला को बेतरतीब ढंग से प्रदर्शित करने की कोशिश कर रहा हूं लेकिन मैं छवियों को दोहराने से बचना चाहता हूं।
नीचे दिया गया कोड स्टार्टअप पर काम करता है लेकिन एक समय आता है जब निम्न त्रुटि बस दिखाई देती है:
पॉप इंडेक्स सीमा से बाहर है
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?
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)
)
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।