2015-10-26 4 views
5

मेरे पास पूर्णांक की एक सूची है जो मैं for लूप के माध्यम से चल रहा हूं यह पता लगाने के लिए कि क्या दो तत्व संयुक्त हैं एक अन्य चर t के बराबर हैं। तो यदि t10 के बराबर था और मेरे पास इंटरगर्स की एक सूची थी: l = [1,2,3,4,5,8,9], तो फ़ंक्शन को संख्या (1,9), (2,8) के सभी अलग-अलग संयोजनों को मुद्रित करना चाहिए।मेरी सूची में लूप के लिए मेरा तत्व क्यों छोड़ रहा है?

मुझे लगता है कि मैं लगभग वहां हूं, लेकिन जब मैं .pop() फ़ंक्शन का उपयोग करता हूं तो सूची में कुछ अजीब होता है। नीचे दिया गया कोड उन संख्याओं के सभी संयोजनों को दिखाने के लिए उपयोग किया जा रहा है जिन्हें गणना करने की आवश्यकता है, लेकिन सूची में मौजूद हर दूसरे तत्व को छोड़ दिया गया है।

1 2 
1 5 
1 8 
1 13 
1 15 
1 26 
1 38 
5 5 
5 8 
5 13 
5 15 
5 26 
5 38 
13 8 
13 13 
13 15 
13 26 
13 38 
26 13 
26 15 
26 26 
26 38 

सूचना कैसे 2, 8, 15, और 38 को छोड़ दिया जाता है:

l = [1,2,5,8,13,15,26,38] 
c = 10 
for i in l: 
    first = i 
    l.pop(0) 
    for x in l: 
     second = x 
     print(first,second) 

यहाँ उत्पादन होता है। मैं l.pop का उपयोग कर रहा हूं ताकि दूसरा for लूप मूल मान का उपयोग नहीं करेगा, और अगली पुनरावृत्ति सूची में अगले तत्व को फिर से चालू करने के लिए आगे बढ़ सकती है।

+10

मैं निश्चित रूप से एक पायथन विशेषज्ञ नहीं हूं, लेकिन मैं आपको बता सकता हूं कि अन्य ऑब्जेक्ट उन्मुख भाषाओं में इसे आम तौर पर एक लूप के भीतर से एक पुनरावर्तक या संग्रह को संशोधित करने के लिए एक बहुत बुरा विचार माना जाता है। मेरा पहला संदेह यहां झूठ बोलता है। आप सूची से पॉप करते हैं और फिर दृश्यों के पीछे सूची [1] संदर्भित करने का प्रयास करते हैं ...लेकिन सूची [1] अब 5 है, 2 उम्मीद नहीं है, क्योंकि आपने सूची में संशोधन किया है। –

+1

मुझे लगता है कि @ डेविडहोलेज़र को सही जवाब मिला। –

+0

@AndrewRushton: यह एक कृत्रिम बाधा है ... आप सूची में उन तत्वों को सुरक्षित रूप से हटा सकते हैं जिन्हें आप वर्तमान में फिर से चालू कर रहे हैं यदि आप सूची में पीछे हटते हैं, हालांकि सूची की प्रतिलिपि पर फिर से सुरक्षित होना सुरक्षित है। बीटीडब्ल्यू '.pop (0)' बल्कि अक्षम है, क्योंकि यह सूची को सभी शेष सूची तत्वों को अंतर को भरने के लिए नीचे ले जाने के लिए मजबूर करता है। –

उत्तर

9

जो आप करने की कोशिश कर रहे हैं वह काम नहीं करेगा, क्योंकि आप इसे पुन: सक्रिय करते समय सूची संशोधित कर रहे हैं। पहले तत्व को वर्तमान "पॉइंटर" बिंदु कहें। अब आप पहले पॉप करते हैं, इसलिए पॉइंटर दूसरे पर है। लेकिन जब लूप आगे बढ़ता है, तो सूचक तीसरे स्थान पर ले जाया जाता है, और दूसरा छोड़ दिया जाता है।

ऐसा लगता है कि आप एक सूची से संयोजन खोजना चाहते हैं। कुछ अन्य तरीके तुम कोशिश कर सकते हैं:

  • अपने वर्तमान दृष्टिकोण के लिए निकटतम: एक while पाश for पाश के बजाय

    while l: 
        first = l.pop(0) 
        for second in l: 
         print(first, second) 
    
  • या आप बस के बजाय सूचकांक सूचियों पुनरावृति सकता है का उपयोग करें खुद को:

    for i in range(len(l)): 
        for k in range(i+1, len(l)): 
         print(l[i], l[k]) 
    
  • या बस का उपयोग itertools.combinations

    import itertools 
    for first, second in itertools.combinations(l, 2): 
        print(first, second) 
    

हालांकि, अगर आप उस से बेहतर कर सकते हैं। चूंकि आप संख्याओं की एक जोड़ी ढूंढ रहे हैं जो कुछ लक्ष्य संख्या तक जोड़ता है, तो दूसरे को प्राप्त करने के लिए लक्ष्य से पहले घटाएं और देखें कि वह नंबर संख्याओं की सूची में है या नहीं। यह लुकअप निरंतर समय में होने के लिए set का उपयोग करें, ओ (एन²) से ओ (एन) तक आपकी समग्र समय जटिलता को कम करें।

numbers = set([1,2,5,8,13,15,26,38]) 
target = 10 
for first in numbers: 
    second = target - first 
    if second > first and second in numbers: 
     print(first, second) 
+0

ग्रेट हेल्प धन्यवाद। सब अब काम कर रहे हैं –

0

आपको एक और दृष्टिकोण चुनने की आवश्यकता है। फॉर लूप का उपयोग करते हुए इसे चालू करते समय आपको सूची से तत्वों को निकालने की अनुमति नहीं है।

संबंधित मुद्दे