[问题] 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