作者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/cn.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