[問題] list內元素搬移的問題

作者: icetofux   2016-11-10 15:31:40
我有2個list分別為list1及list2, 想依序一一把list1的元素搬移到list2, 我寫了下
列程式碼:
list1 = []
list2 = []
list1.append("A")
list1.append("B")
list1.append("C")
list1.append("D")
list1.append("E")
list1.append("F")
print("Before:")
print("list1=", list1)
print("list2=", list2)
print("")
print("copying:")
for element in list1:
list2.append(element)
print("list2=", list2)
list1.remove(element)
print("list1=", list1)
print("")
print("After:")
print("list1=", list1)
print("list2=", list2)
輸出結果為:
Before:
list1= ['A', 'B', 'C', 'D', 'E', 'F']
list2= []
copying:
list2= ['A'] #1 : list2.append(element)
list1= ['B', 'C', 'D', 'E', 'F'] #2 : list1.remove(element)
list2= ['A', 'C'] #3 : list2.append(element)
list1= ['B', 'D', 'E', 'F'] #4 : list1.remove(element)
list2= ['A', 'C', 'E'] #5 : list2.append(element)
list1= ['B', 'D', 'F'] #6 : list1.remove(element)
After:
list1= ['B', 'D', 'F']
list2= ['A', 'C', 'E']
#1 把 "A" 加到 list2 與預期相同
#2 把 "A" 從 list1 移除與預期相同
不過#3為什麼是 "C" 被加到 list2 而不是 "B" 呢?
作者: icetofux   2016-11-10 15:32:00
對了,我知道有更簡單的方式可以copy list,我是故意這樣做在實驗,想對python這語言有更多了解,謝謝。
作者: gmccntzx1 (o.O)   2016-11-10 16:01:00
你把for element in list1那邊改用enumerate,印出每次跑的index,你就知道為什麼了即`for idx, element in enumerate(list1)`
作者: tiefblau (tiefblau)   2016-11-10 16:14:00
index被你remove移動到拉~
作者: icetofux   2016-11-10 16:17:00
謝謝兩位,我想通這個問題了。
作者: LaughPoint (腳步)   2016-11-10 18:10:00
不懂 list的remove不是刪除指定的值嗎?remove是記值去刪index嗎?
作者: gmccntzx1 (o.O)   2016-11-10 18:23:00
問題是在被迭代的list1被更動,不是remove影響到index
作者: LaughPoint (腳步)   2016-11-10 18:25:00
恩恩 剛剛也想到了 謝謝解答
作者: gmccntzx1 (o.O)   2016-11-10 18:25:00
迴圈開始後,index會在每次重新迭代時+1,但是list1長度會逐漸減少,導致迴圈不會執行到原有list1長度的次數而list1中的元素是從index小的開始被移除,所以每往下一次迭代,移除的元素就不是實際上想移除的@LaughPoint 不會,小事再幫補充一下,如果真的要用這種做法去移除元素,可以從index較大的開始移除; 或著加一個counter,記下已經移除的元素數目,去修正要移除元素的index的位置
作者: Yshuan (倚絃)   2016-11-10 19:35:00
很多語言都有這個問題 python不會這樣寫還是真的沒碰過
作者: s89227 (Kei)   2016-11-11 01:39:00
真的要寫這種用while條件設list長度會比較好
作者: bigpigbigpig (To littlepig with love)   2016-11-11 07:13:00
作者: checkIO (chec)   2016-11-11 23:10:00
我會用while(lista): listb.append(lista()) lista.remove()

Links booklink

Contact Us: admin [ a t ] ucptt.com