आपको उस सूची को संशोधित नहीं करना चाहिए जिस पर आप पुनरावृत्त कर रहे हैं, इसके परिणामस्वरूप आश्चर्यजनक व्यवहार होता है (क्योंकि इटरेटर आंतरिक रूप से इंडेक्स का उपयोग करता है और तत्वों को हटाकर उन्हें बदल दिया जाता है)।
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]
स्रोत
2012-04-02 02:20:54
क्या करना चाहिए उत्पादन सूचियों कि आप चाहते हैं का निर्माण होता है, और फिर शायद मूल फेंक (या इस पर आवंटित) यदि आप इसकी ज़रूरत नहीं है। –
@ करल: मैंने अभी ठीक करने के लिए एक सूची समझ को जोड़ा है। –
@NiklasB। सूची समझ वास्तव में मैं क्या कर रहा था, लेकिन मुझे यकीन नहीं था कि मुझे शुरुआत में समस्या क्यों मिल रही थी। – devinpleuler