मैं अपनी सूची समझ कौशल पर काम कर रहा हूं, मेरी समझ को तेज करने के लिए अभ्यास की तलाश में हूं। लेकिन मैं एक ऐसे मुकाम पर पहुंच गया हूं, जिसके आसपास मैं पहुंच नहीं सकता। मान लीजिए कि मैं सभी संभावित सूचियों की एक सूची चाहता हूं जिसमें 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" को असाइन नहीं किया गया हो। जाहिरा तौर पर यहाँ कुछ है जो मुझे समझ में नहीं आ रहा है। तो, यहाँ मेरा प्रश्न है: मैं सूची समझ में एक नेस्टेड सूची को कैसे दोहरा सकता हूं यदि मैं इसे समझ के भीतर एक चर के लिए निर्दिष्ट नहीं कर सकता? अग्रिम में धन्यवाद।

0
Pleasant Nightmares 13 पद 2020, 00:50
यह सुनिश्चित करने के लिए कि आप अपनी डेटा संरचनाओं और उनकी सामग्री को समझते हैं, अंदर से बाहर काम करने का प्रयास करें। सूची की समझ को पायथन डॉक्स में अच्छी तरह से वर्णित किया गया है, जिसमें एक उदाहरण भी शामिल है जो आपके बहुत करीब है। . साथ ही, अपनी स्वयं की वाक्यविन्यास समस्याओं को हल करना आपको यहां उत्तर प्राप्त करने से कहीं अधिक सिखाएगा।
 – 
PeterK
13 पद 2020, 01:05
1
मैं स्टैक ओवरफ्लो के बिंदु को देखने में विफल रहता हूं यदि मेरी समझ के लिए मुझे केवल एक ही मदद मिल सकती है "दस्तावेज़ीकरण पढ़ें और अपनी समस्या को हल करने का प्रयास करें", पीटर। मैं बस यही कर रहा हूं, और मुझे परेशानी हो रही है। इसलिए मैं यहां आया हूं।
 – 
Pleasant Nightmares
13 पद 2020, 01:12
बाहरी सूची समझ list7 में सूची समझ नहीं है क्योंकि इसमें कुछ भी पुनरावृत्त नहीं किया जा रहा है। अर्थात। एक in foo खंड।
 – 
dpwr
13 पद 2020, 01:41
खेद है कि आप ऐसा महसूस करते हैं। जैसा कि @dpwrussel बताता है, आपकी दूसरी सूची समझ में कोई in नहीं है। कुछ चीजें बस इधर-उधर खेलने, फिर से जाँचने आदि में बहुत लगती हैं। आप इसे प्राप्त करेंगे।
 – 
PeterK
13 पद 2020, 04:27

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] निर्माण के लिए महंगा था या प्रत्येक आइटम गैर-तुच्छ मात्रा में स्मृति का उपयोग करता था, तो यह मायने रखता था।

1
dpwr 13 पद 2020, 19:56
या सिर्फ [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] सूची समझ का अति प्रयोग करने के लिए।
 – 
PeterK
14 पद 2020, 00:48
1
यह बिल्कुल मेरे वैकल्पिक समाधान जैसा ही है, बस एक पंक्ति में लिखा गया है और कंटेनर के लिए एक टपल का उपयोग कर रहा है!
 – 
dpwr
14 पद 2020, 01:06