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

看板Python作者時間7年前 (2016/11/10 15:31), 編輯推噓6(6018)
留言24則, 8人參與, 最新討論串1/1
我有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" 呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.72.212.239 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1478763102.A.04B.html

11/10 15:32, , 1F
對了,我知道有更簡單的方式可以copy list,我是故意
11/10 15:32, 1F

11/10 15:33, , 2F
這樣做在實驗,想對python這語言有更多了解,謝謝。
11/10 15:33, 2F

11/10 16:01, , 3F
你把for element in list1那邊改用enumerate,印出每次
11/10 16:01, 3F

11/10 16:01, , 4F
跑的index,你就知道為什麼了
11/10 16:01, 4F

11/10 16:02, , 5F
即`for idx, element in enumerate(list1)`
11/10 16:02, 5F

11/10 16:14, , 6F
index被你remove移動到拉~
11/10 16:14, 6F

11/10 16:17, , 7F
謝謝兩位,我想通這個問題了。
11/10 16:17, 7F

11/10 18:10, , 8F
不懂 list的remove不是刪除指定的值嗎?
11/10 18:10, 8F

11/10 18:18, , 9F
remove是記值去刪index嗎?
11/10 18:18, 9F

11/10 18:23, , 10F
問題是在被迭代的list1被更動,不是remove影響到index
11/10 18:23, 10F

11/10 18:25, , 11F
恩恩 剛剛也想到了 謝謝解答
11/10 18:25, 11F

11/10 18:25, , 12F
迴圈開始後,index會在每次重新迭代時+1,但是list1長度
11/10 18:25, 12F

11/10 18:26, , 13F
會逐漸減少,導致迴圈不會執行到原有list1長度的次數
11/10 18:26, 13F

11/10 18:27, , 14F
而list1中的元素是從index小的開始被移除,所以每往下一
11/10 18:27, 14F

11/10 18:27, , 15F
次迭代,移除的元素就不是實際上想移除的
11/10 18:27, 15F

11/10 18:28, , 16F
@LaughPoint 不會,小事
11/10 18:28, 16F

11/10 18:29, , 17F
再幫補充一下,如果真的要用這種做法去移除元素,可以從
11/10 18:29, 17F

11/10 18:30, , 18F
index較大的開始移除; 或著加一個counter,記下已經移除
11/10 18:30, 18F

11/10 18:30, , 19F
的元素數目,去修正要移除元素的index的位置
11/10 18:30, 19F

11/10 19:35, , 20F
很多語言都有這個問題 python不會這樣寫還是真的沒碰過
11/10 19:35, 20F

11/11 01:39, , 21F
真的要寫這種用while條件設list長度會比較好
11/11 01:39, 21F

11/11 07:13, , 22F

11/11 23:10, , 23F
我會用while(lista): listb.append(lista()) lista.remo
11/11 23:10, 23F

11/11 23:10, , 24F
ve()
11/11 23:10, 24F
文章代碼(AID): #1O929U1B (Python)