मैं अपनी सूची समझ कौशल पर काम कर रहा हूं, मेरी समझ को तेज करने के लिए अभ्यास की तलाश में हूं। लेकिन मैं एक ऐसे मुकाम पर पहुंच गया हूं, जिसके आसपास मैं पहुंच नहीं सकता। मान लीजिए कि मैं सभी संभावित सूचियों की एक सूची चाहता हूं जिसमें 3 यादृच्छिक अंक श्रेणी (1,3) में हों, जिसमें प्रत्येक सूची का योग 3 तक न हो।
[[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 1, 1], [0, 2, 0] ...]
जाहिर है, मुझे नेस्टेड सूची समझ के साथ ऐसा करने की ज़रूरत है। लेकिन मुझे सच में यकीन नहीं है कि इसके बारे में कैसे जाना है। जहां तक मुझे पता है, मैं सूची समझ के भीतर एक चर के लिए एक सूची निर्दिष्ट नहीं कर सकता। लेकिन मुझे आउटपुट को संदर्भित करने के लिए उस चर की आवश्यकता है:
list7 = [[randint(0,2) for x in range(3)] for y if sum(y) != 3]
यह मुझे एक वाक्यविन्यास त्रुटि देता है। मैंने पहले एक चर के लिए आंतरिक सूची निर्दिष्ट करने का प्रयास किया है, और यह काम नहीं कर रहा है, या तो:
y = [randint(0,2) for x in range(3)]
list7 = [y for y if sum(y) != 3]
हालाँकि, जो मुझे हैरान करता है, वह यह है कि "y" यहाँ कोई त्रुटि नहीं देता है। यह व्यवहार करता है जैसा कि मैं अपेक्षा करता हूं, भले ही रैंडिंट को "x" को असाइन नहीं किया गया हो। जाहिरा तौर पर यहाँ कुछ है जो मुझे समझ में नहीं आ रहा है। तो, यहाँ मेरा प्रश्न है: मैं सूची समझ में एक नेस्टेड सूची को कैसे दोहरा सकता हूं यदि मैं इसे समझ के भीतर एक चर के लिए निर्दिष्ट नहीं कर सकता? अग्रिम में धन्यवाद।
1 उत्तर
जैसा कि मैंने अपनी टिप्पणी में बताया है, आपके समाधान के साथ एक समस्या यह है कि बाहरी सूची समझ में कोई पुनरावर्तनीय नहीं है। तो यह कैसे पता चलेगा कि कितने परिणाम देने हैं, या कब परिणाम देना बंद करना है?
आपके if
खंड में भी एक समस्या है। आपके if
में आप sum(y)
करते हैं, जो मुझे लगता है कि इसका मतलब था, "[randint(0,2) for x in range(3)]
के परिणाम का योग करें"। यह पीछे की ओर है क्योंकि if
को पहले निष्पादित किया जाता है। साथ ही, y इटरेटर में वर्तमान आइटम के लिए लूप वैरिएबल है न कि उस आइटम के लिए सूची समझ का परिणाम।
आपके समाधान के साथ एक और समस्या यह है कि आप randint
का उपयोग कर रहे हैं। तो आप कई बार कुछ संयोजन बना सकते हैं और अन्य बिल्कुल नहीं। यह बात से कुछ हटकर है।
मुझे लगता है कि शायद आप इस तरह कुछ सूची समझ में बदलना चाह रहे थे।
results = []
for i in range(3):
for j in range(3):
for k in range(3):
if i + j + k != 3:
results.append([i, j, k])
जो पूरी तरह से करने योग्य है, लेकिन उत्तर नेस्टेड सूची समझ नहीं है क्योंकि ऐसा तब होता है जब आपको सूचियों की सूचियां उत्पन्न करने की आवश्यकता होती है और इस मामले में, केवल आपकी बाहरी सूची को समझने की आवश्यकता होती है, आपकी आंतरिक सूचियां कंटेनर में केवल 3 अंक होती हैं। यह उतनी ही आसानी से एक टपल हो सकता था।
सूचियों की एक सूची के साथ आप क्या समाप्त करना चाहते हैं, इस परिप्रेक्ष्य से इस बारे में सोचना सबसे अच्छा है। इसका मतलब है कि आपको कुछ ऐसा चाहिए जो एक सूची तैयार करे, जिसमें अन्य सूचियां हों।
तो आप उन ३ अंकों को उत्पन्न करना चाहते हैं, जांचें कि क्या वे ३ तक जोड़ते हैं और यदि नहीं, तो वे उन वस्तुओं में से एक हैं जो आपके परिणामों में एक सूची के रूप में जोड़े जाते हैं। आप इस तथ्य का लाभ उठा सकते हैं कि अजगर में सूची की समझ कई पुनरावृत्तियों का समर्थन करती है, लूप के लिए नेस्टेड जैसी ही चीज़ को प्राप्त करने के लिए।
results = [
[i, j, k]
for i in range(3) for j in range(3) for k in range(3)
if i + j + k != 3
]
बहुत अधिक उपयोगी उदाहरणों के लिए आधिकारिक दस्तावेज़ देखें: http://docs .python.org/2/tutorial/datastructures.html#list-comprehensions
संपादित करें:
यह मेरे साथ हुआ कि आप जो करने की कोशिश कर रहे थे वह यह था:
results = [
item for item in [
[i, j, k]
for i in range(3) for j in range(3) for k in range(3)
]
if sum(item) != 3
]
जो आपके कोड की तरह थोड़ा और दिखता है। यह परिणामों के संदर्भ में समान है, लेकिन बहुत कम प्रदर्शन करने वाला हो सकता है (प्रक्रिया और स्मृति दोनों के संदर्भ में) क्योंकि इस उदाहरण में, आप एक सूची में सभी [i, j, k]
संभावनाओं का निर्माण करते हैं, और फिर उन्हें नीचे फ़िल्टर करते हैं जो 3 तक नहीं जुड़ते हैं। बेहतर है कि उन सूचियों को कभी भी न बनाया जाए। इस छोटे से उदाहरण के लिए इससे थोड़ा फर्क पड़ता है, लेकिन अगर [x, y, z]
निर्माण के लिए महंगा था या प्रत्येक आइटम गैर-तुच्छ मात्रा में स्मृति का उपयोग करता था, तो यह मायने रखता था।
[t for t in [(x, y, z) for x in range(3) for y in range(3) for z in range(3)] if sum(t) != 3]
सूची समझ का अति प्रयोग करने के लिए।
संबंधित सवाल
नए सवाल
list
सूची टैग का उल्लेख हो सकता है: एक लिंक की गई सूची (नोड का एक सेट सेट, प्रत्येक इसका उत्तराधिकारी संदर्भित करता है), या डायनामिक सरणी का एक रूप। HTML सूचियों के लिए उपयोग नहीं किया जा रहा है, इसके बजाय [html-सूचियों] का उपयोग करें।
list7
में सूची समझ नहीं है क्योंकि इसमें कुछ भी पुनरावृत्त नहीं किया जा रहा है। अर्थात। एकin foo
खंड।in
नहीं है। कुछ चीजें बस इधर-उधर खेलने, फिर से जाँचने आदि में बहुत लगती हैं। आप इसे प्राप्त करेंगे।