作者icetofux ()
看板Python
標題[問題] list內元素搬移的問題
時間Thu Nov 10 15:31:40 2016
我有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://webptt.com/m.aspx?n=bbs/Python/M.1478763102.A.04B.html
1F:→ icetofux: 對了,我知道有更簡單的方式可以copy list,我是故意 11/10 15:32
2F:→ icetofux: 這樣做在實驗,想對python這語言有更多了解,謝謝。 11/10 15:33
3F:→ gmccntzx1: 你把for element in list1那邊改用enumerate,印出每次 11/10 16:01
4F:→ gmccntzx1: 跑的index,你就知道為什麼了 11/10 16:01
5F:→ gmccntzx1: 即`for idx, element in enumerate(list1)` 11/10 16:02
6F:推 tiefblau: index被你remove移動到拉~ 11/10 16:14
7F:→ icetofux: 謝謝兩位,我想通這個問題了。 11/10 16:17
8F:推 LaughPoint: 不懂 list的remove不是刪除指定的值嗎? 11/10 18:10
9F:→ LaughPoint: remove是記值去刪index嗎? 11/10 18:18
10F:→ gmccntzx1: 問題是在被迭代的list1被更動,不是remove影響到index 11/10 18:23
11F:推 LaughPoint: 恩恩 剛剛也想到了 謝謝解答 11/10 18:25
12F:→ gmccntzx1: 迴圈開始後,index會在每次重新迭代時+1,但是list1長度 11/10 18:25
13F:→ gmccntzx1: 會逐漸減少,導致迴圈不會執行到原有list1長度的次數 11/10 18:26
14F:→ gmccntzx1: 而list1中的元素是從index小的開始被移除,所以每往下一 11/10 18:27
15F:→ gmccntzx1: 次迭代,移除的元素就不是實際上想移除的 11/10 18:27
16F:→ gmccntzx1: @LaughPoint 不會,小事 11/10 18:28
17F:→ gmccntzx1: 再幫補充一下,如果真的要用這種做法去移除元素,可以從 11/10 18:29
18F:→ gmccntzx1: index較大的開始移除; 或著加一個counter,記下已經移除 11/10 18:30
19F:→ gmccntzx1: 的元素數目,去修正要移除元素的index的位置 11/10 18:30
20F:推 Yshuan: 很多語言都有這個問題 python不會這樣寫還是真的沒碰過 11/10 19:35
21F:推 s89227: 真的要寫這種用while條件設list長度會比較好 11/11 01:39
23F:推 checkIO: 我會用while(lista): listb.append(lista()) lista.remo 11/11 23:10
24F:→ checkIO: ve() 11/11 23:10