2012-04-02 11 views
5
listA = [1,2,3] 
listB = [] 

print listA 
print listB 

for i in listA: 
     if i >= 2: 
       listB.append(i) 
       listA.remove(i) 
print listA 
print listB 

यह केवल तत्व "2" को क्यों जोड़ता है और हटा देता है?सूचियों के बीच पाइथन तत्वों को स्थानांतरित करना

इसके अलावा, जब मैं "listA.remove (i)" पर टिप्पणी करता हूं, तो यह अपेक्षा के अनुसार काम करता है।

उत्तर

12

आपको उस सूची को संशोधित नहीं करना चाहिए जिस पर आप पुनरावृत्त कर रहे हैं, इसके परिणामस्वरूप आश्चर्यजनक व्यवहार होता है (क्योंकि इटरेटर आंतरिक रूप से इंडेक्स का उपयोग करता है और तत्वों को हटाकर उन्हें बदल दिया जाता है)।

for i in listA[:]: 
    if i >= 2: 
    listB.append(i) 
    listA.remove(i) 

उदाहरण::

>>> listA = [1,2,3] 
>>> listB = [] 
>>> for i in listA[:]: 
... if i >= 2: 
...  listB.append(i) 
...  listA.remove(i) 
... 
>>> listA 
[1] 
>>> listB 
[2, 3] 

हालांकि, यह अक्सर अधिक स्वच्छ कार्यात्मक रास्ते जाने के लिए और बिल्कुल नहीं मूल सूची को संशोधित है आप क्या कर सकते एक प्रतिलिपि listA की से अधिक पुनरावृति करने के लिए है , इसके बजाय बस आपको आवश्यक मूल्यों के साथ एक नई सूची बनाना। आप ऐसा करने सुंदर ढंग से सूची comprehensions उपयोग कर सकते हैं:

>>> lst = [1,2,3] 
>>> small = [a for a in lst if a < 2] 
>>> big = [a for a in lst if a >= 2] 
>>> small 
[1] 
>>> big 
[2, 3] 
+0

क्या करना चाहिए उत्पादन सूचियों कि आप चाहते हैं का निर्माण होता है, और फिर शायद मूल फेंक (या इस पर आवंटित) यदि आप इसकी ज़रूरत नहीं है। –

+0

@ करल: मैंने अभी ठीक करने के लिए एक सूची समझ को जोड़ा है। –

+0

@NiklasB। सूची समझ वास्तव में मैं क्या कर रहा था, लेकिन मुझे यकीन नहीं था कि मुझे शुरुआत में समस्या क्यों मिल रही थी। – devinpleuler

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