2010-03-29 13 views
7

मैं एक सूची की सामग्री को दूसरे स्थानांतरित करने की कोशिश कर रहा हूं, लेकिन यह काम नहीं कर रहा है और मुझे नहीं पता कि क्यों नहीं। मेरे कोड इस तरह दिखता है:आइटम हटाने के लिए एक सूची के माध्यम से पुनरावृत्त, कुछ आइटम

list1 = [1, 2, 3, 4, 5, 6] 
list2 = [] 

for item in list1: 
    list2.append(item) 
    list1.remove(item) 

लेकिन मेरी उत्पादन इस तरह दिखता है अगर मैं इसे चलाएँ:

>>> list1 
[2, 4, 6] 
>>> list2 
[1, 3, 5] 

मेरा प्रश्न तीन गुना है, मुझे लगता है: क्यों हो रहा है, मैं यह कैसे काम कर सकता हूँ , और क्या मैं एक 'चाल' कथन या कुछ जैसे अविश्वसनीय रूप से सरल समाधान को देख रहा हूं?

+0

सभी मदद लोगों के लिए धन्यवाद - यह एक अच्छा संक्षिप्त स्पष्टीकरण है कि मैं क्या गलत कर रहा था और कई फिक्स विकल्प, जो मैं अब घूमने जा रहा हूं और अब लागू करने का प्रयास कर रहा हूं। =) – potatocubed

उत्तर

8

कारण यह है कि आप (अनुलग्नक और) पहली सूची से को हटाते हैं जिससे यह छोटा हो जाता है। तो पूरी सूची के माध्यम से चलने से पहले इटेटरेटर बंद हो जाता है।

प्राप्त करने के लिए आप क्या चाहते हैं, ऐसा करते हैं:

list1 = [1, 2, 3, 4, 5, 6] 
list2 = [] 

# You couldn't just make 'list1_copy = list1', 
# because this would just copy (share) the reference. 
# (i.e. when you change list1_copy, list1 will also change) 

# this will make a (new) copy of list1 
# so you can happily iterate over it (without anything getting lost :) 
list1_copy = list1[:] 

for item in list1_copy: 
    list2.append(item) 
    list1.remove(item) 

list1[start:end:step]slicing syntax है: जब आप 0 के शुरू खाली यह चूक छोड़ देते हैं, जब आप अंत खाली यह उच्चतम संभव है छोड़ मूल्य। तो सूची 1 [:] का अर्थ है इसमें सब कुछ। (वालाकोल्लू के लिए धन्यवाद)

कुछ दोस्तों की तरह, आप extend का उपयोग भी कर सकते हैं- list का तरीका - केवल एक सूची को दूसरी सूची में कॉपी करने के लिए, यदि यह आपका इरादा था। (लेकिन मैंने उपरोक्त तरीके का चयन किया, क्योंकि यह आपके दृष्टिकोण के नजदीक है।)

जैसा कि आप पाइथन के लिए नए हैं, मेरे पास आपके लिए कुछ है: Dive Into Python 3 - यह मुफ़्त और आसान है। - मज़े करो!

+1

और सूची अनुक्रमण/टुकड़ा करने की व्याख्या करने के लिए एक लिंक ('सूची [:] 'सूची स्लाइसिंग का एक उदाहरण है): http://docs.python.org/tutorial/introduction.html#lists – Ponkadoodle

8

आप इस पर पुनरावृत्ति करते समय सूची 1 से आइटम हटा रहे हैं।

वह परेशानी के लिए पूछ रहा है।

इस प्रयास करें:

>>> list1 = [1,2,3,4,5,6] 
>>> list2 = [] 
>>> list2 = list1[:] # we copy every element from list1 using a slice 
>>> del list1[:] # we delete every element from list1 
+2

सूची 2 = [] की आवश्यकता नहीं है –

1

ठीक वैसे जैसे ChristopheD कहते हैं।

ऐसा कर सकता है:

list1 = [1, 2, 3, 4, 5, 6] 
list2 = [] 

for item in list1: 
    list2.append(item) 

list1 = [] 

चल जाएगा कि स्पष्ट List1।

संपादित करें उन्होंने अपनी पोस्ट अपडेट की है। मैं इसे थोड़ा सा विकल्प के रूप में छोड़ दूंगा।

3

जब आप इसे फिर से चालू करते हैं तो आपको सूची को संशोधित नहीं करना चाहिए। यह इटेटरेटर को गलत आइटम पर इंगित करने का कारण बनता है। पहले आइटम को संभालने के बाद, इटेटरेटर इंडेक्स = 1 पर इशारा कर रहा है, लेकिन क्योंकि आपने एक आइटम हटा दिया है, अगली वस्तु अब सूचकांक शून्य पर है, इसलिए इसे छोड़ दिया जाएगा। यही कारण है कि आप केवल हर दूसरे आइटम को संभालने वाले हैं।

प्रयास करें:

list2.extend(list1) # This appends all items from list1 to list2. 
del list1[:] # From ChristopheD's post. 
+0

डाउनवॉटर के लिए: डाउनवोट का कारण? अगर मेरी पोस्ट में कोई त्रुटि है, तो मैं जानना चाहता हूं कि यह क्या है ताकि मैं भविष्य के लिए सीख सकूं। –

1

एक सूची समझ का उपयोग करना:

list2 = [item for item in list1] 

बाइंड नाम के list2 एक ही वस्तु के रूप में list1:

list2 = list1 

(ध्यान दें कि आप को संशोधित करता है, तो list1 की सामग्री, list2 बी इस मामले List1 में

list2 = list1[:] 

और List2 विभिन्न वस्तुओं रहे हैं: ई उसके अनुसार बदल)

list1 की एक प्रति बनाएं और नाम list2 को यह बाँध।।

+0

दूसरा विकल्प काम नहीं करेगा जैसा कि आपको लगता है (विशेष रूप से जब आप सूची 1 के आइटम को हटाना चाहते हैं) – ChristopheD

+0

@ क्रिस्टोफेड: क्षमा करें, मेरा उत्तर स्पष्ट नहीं है। जब मैं कहता हूं कि सूची सूची 2 को उसी ऑब्जेक्ट में सूची 1 के रूप में बांधें, तो मुझे लगता है कि ओपी यह जान लेगा कि सूची 2 और सूची 1 दोनों एक ही ऑब्जेक्ट के लिए नाम हैं। –

+0

क्षमा करें, मैंने आपके उत्तर को गलत तरीके से गलत/गलत व्याख्या किया हो सकता है तो – ChristopheD

1

ऐसा करें:

list1 = [1, 2, 3, 4, 5, 6] 
list2 = [] 

list2.extend(list1) 
list1[:] = [] 
4

आवश्यक डिबगिंग कौशल: print बयान जोड़ें। (या अजगर 3 में print कार्यों)

>>> list1= [1, 2, 3, 4, 5, 6] 
>>> for item in list1: 
...  print item 
...  list1.remove(item) 
...  print list1 
... 
1 
[2, 3, 4, 5, 6] 
3 
[2, 4, 5, 6] 
5 
[2, 4, 6] 

सूचना है कि अजगर पदों की सूची के से निकलने के लिए कोशिश कर रहा है, लेकिन आप सूची से आइटम निकालना रखने के लिए, पदों अर्थहीन बना रही है।

पायथन सूची से 0 स्थिति पर आइटम को चुनता है।

फिर आप सूची को बदलकर आइटम को हटा दें।

अजगर फिर सूची में से स्थिति 1 में आइटम उठाता है (एक आइटम को छोड़ने के लिए प्रदर्शित होने)

फिर आप उस वस्तु को निकालना, सूची बदलते।

अजगर फिर सूची में से स्थिति 2 में आइटम उठाता है (एक आइटम को छोड़ने के लिए प्रदर्शित होने)

तब आप आइटम को हटा दें, सूची बदलते।

पाइथन फिर स्थिति 3 पर आइटम चुनना पसंद करेंगे, लेकिन ऐसी कोई वस्तु नहीं है। तो लूप बंद हो जाता है।

1

वहाँ भी विनम्र प्रतिलिपि समारोह (या deepcopy यदि आप अपनी सूची में जटिल वस्तुओं और न सिर्फ पूर्णांक है):

from copy import copy 

list2 = copy(list1) 

यदि आप बताएं कि आपको क्या कोशिश कर रहे हैं एक और अधिक उचित जवाब मिल सकता है पूरा करने के लिए (जब तक कि आप केवल पाइथन सूचियों के बारे में नहीं सीख रहे हों)।

पायथन में "चर" केवल नाम/संदर्भ हैं, इसलिए आप जो विनाशकारी प्रतिलिपि करना चाहते हैं वह अजीब लगता है।आप List2 ही मान करना चाहते हैं के रूप में List1 तुम सिर्फ कर सकते हैं:

list2 = list1 # now they are both referring to the same list 

और अगर उसके बाद आप कुछ और के लिए List1 उपयोग करना चाहते हैं, तो आप सिर्फ कर सकते हैं:

list1 = ['A', 'B', 'C'] 
+0

और फिर सूची 2 भी' ['ए', 'बी', 'सी'] '। प्रश्न यह है: फिर दो सूचियां क्यों हैं ;-) – ChristopheD

+0

@ क्रिस्टोफेड: सूची 2 नहीं बदली - मैंने अभी जांच की है। एक नई सूची वस्तु बनाई जा रही है और नाम सूची 1 से जुड़ी हुई है, जिससे सूची 2 अप्रभावित है। –

+0

@PreludeAndFugue: हम्म, अच्छा बिंदु (उचित सोच के बिना बहुत जल्दी निर्णय लिया गया) – ChristopheD

1

आप के रूप में अन्य उत्तरों में देख सकते हैं, आप इसे फिर से चालू करते समय सूची को संशोधित करने का प्रयास कर रहे हैं। यह काम नहीं करता है। एक सूची को दूसरे में कॉपी करने के कई तरीके हैं। मैंने यह देखने के लिए कुछ परीक्षण किए हैं कि प्रत्येक दृष्टिकोण कितना तेज़ है:

>>> timeit.Timer('list2 = list1[:]', 'list1 = range(10**3)').timeit(10**6) 
3.9134418964385986 

>>> timeit.Timer('list2 = []; list2.extend(list1)', 'list1 = range(10**3)').timeit(10**6) 
4.9082601070404053 

>>> timeit.Timer('list2 = copy.copy(list1)', 'import copy; list1 = range(10**3)').timeit(10**6) 
7.5023419857025146 

>>> timeit.Timer('list2 = [i for i in list1]', 'list1 = range(10**3)').timeit(10**6) 
95.697894811630249 

टुकड़ा वाक्यविन्यास सबसे तेज़ है। सूची समझ का उपयोग करने से यह बहुत तेज़ है।

एक सूची को साफ़ करने के लिए, आप का उपयोग कर सकते हैं:

del list1[:] 
0

@potatocubed: दिए गए उत्तर से कई तुच्छ उदाहरण आप दे दी का समाधान ("List1 ले जाने List2 के लिए"), लेकिन वास्तव में व्याख्या नहीं करते गहरी समस्या का "क्यों", जो एक सूची को संशोधित कर रहा है जैसा आप इसे फिर से करते हैं। अध्ययन एस। लॉट का जवाब ...

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