Python 在移除项的列表中迭代,某些项不会被移除
我正在尝试将一个列表的内容转移到另一个列表,但它不起作用,我不知道为什么不起作用。我的代码如下所示:Python 在移除项的列表中迭代,某些项不会被移除,python,list,Python,List,我正在尝试将一个列表的内容转移到另一个列表,但它不起作用,我不知道为什么不起作用。我的代码如下所示: list1 = [1, 2, 3, 4, 5, 6] list2 = [] for item in list1: list2.append(item) list1.remove(item) >>> list1 [2, 4, 6] >>> list2 [1, 3, 5] 但如果我运行它,我的输出如下所示: list1 = [1, 2, 3,
list1 = [1, 2, 3, 4, 5, 6]
list2 = []
for item in list1:
list2.append(item)
list1.remove(item)
>>> list1
[2, 4, 6]
>>> list2
[1, 3, 5]
但如果我运行它,我的输出如下所示:
list1 = [1, 2, 3, 4, 5, 6]
list2 = []
for item in list1:
list2.append(item)
list1.remove(item)
>>> list1
[2, 4, 6]
>>> list2
[1, 3, 5]
我想,我的问题有三个:为什么会发生这种情况,我如何使它工作,我是否忽略了一个非常简单的解决方案,比如“move”语句或其他什么?在迭代列表1时,您正在从列表1中删除项 那是自找麻烦 试试这个:
>>> list1 = [1,2,3,4,5,6]
>>> list2 = []
>>> list2 = list1[:] # we copy every element from list1 using a slice
>>> del list1[:] # we delete every element from list1
正如克里斯托弗所说 可以这样做:
list1 = [1, 2, 3, 4, 5, 6]
list2 = []
for item in list1:
list2.append(item)
list1 = []
那将清除列表1
编辑他/她已更新其帖子。我将把它留作一个小的选择。您不应该在迭代列表时修改它。这会导致迭代器指向错误的项。处理完第一个项目后,迭代器指向index=1,但由于您删除了一个项目,下一个项目现在位于索引0,因此将跳过它。这就是为什么你只处理其他每一项 尝试:
使用列表理解:
list2 = [item for item in list1]
将名称list2
绑定到与list1
相同的对象:
list2 = list1
(请注意,如果您修改list1
的内容,list2
将相应更改。)
创建list1
的副本并将其绑定到名称list2
:
list2 = list1[:]
在本例中,list1和list2是不同的对象。原因是您正在(追加和)从第一个列表中删除它,从而使其变小。因此迭代器在遍历整个列表之前停止
要实现您的目标,请执行以下操作:
list1 = [1, 2, 3, 4, 5, 6]
list2 = []
# You couldn't just make 'list1_copy = list1',
# because this would just copy (share) the reference.
# (i.e. when you change list1_copy, list1 will also change)
# this will make a (new) copy of list1
# so you can happily iterate over it ( without anything getting lost :)
list1_copy = list1[:]
for item in list1_copy:
list2.append(item)
list1.remove(item)
list1[start:end:step]
是:当您将start留空时,它默认为0,当您将end留空时,它是可能的最高值。所以列表1[:]意味着其中的一切。(感谢瓦拉科洛)
正如一些人所说,如果您有意的话,您也可以使用列表
-对象的扩展
-方法将一个列表复制到另一个列表。(但我选择了上面的方法,因为这接近于您的方法。)
由于您是python新手,我有一些东西给您:-它是免费和简单的。-玩得开心 试试这个:
list1 = [1, 2, 3, 4, 5, 6]
list2 = []
list2.extend(list1)
list1[:] = []
基本调试技巧:添加
打印语句。(或Python 3中的print
函数)
请注意,Python正试图单步遍历列表的位置,但您不断从列表中删除项目,使得位置变得毫无意义
Python从列表中选择位置0处的项
然后删除该项,更改列表
Python然后从列表中选择位置1处的项目(似乎跳过了一个项目)
然后删除该项,更改列表
Python然后从列表中选择位置2处的项目(似乎跳过了一个项目)
然后删除该项,更改列表
Python随后希望在位置3选择该项,但没有这样的项。因此循环停止。还有一个简单的复制函数(如果列表中有复杂的对象而不仅仅是整数,则为deepcopy):
如果您解释了您试图实现的目标,您可能会得到一个更合适的答案(除非您只是在学习python列表)
Python中的“变量”只是名称/引用,因此您想要进行的破坏性复制似乎有点奇怪。如果希望列表2的值与列表1的值相同,可以执行以下操作:
list2 = list1 # now they are both referring to the same list
list1 = ['A', 'B', 'C']
如果在此之后您想将list1用于其他用途,您可以执行以下操作:
list2 = list1 # now they are both referring to the same list
list1 = ['A', 'B', 'C']
正如您在其他答案中所看到的,您试图在迭代列表时修改列表。这不管用。有许多方法可以将一个列表复制到另一个列表。我做了一些测试,看看每种方法有多快:
>>> timeit.Timer('list2 = list1[:]', 'list1 = range(10**3)').timeit(10**6)
3.9134418964385986
>>> timeit.Timer('list2 = []; list2.extend(list1)', 'list1 = range(10**3)').timeit(10**6)
4.9082601070404053
>>> timeit.Timer('list2 = copy.copy(list1)', 'import copy; list1 = range(10**3)').timeit(10**6)
7.5023419857025146
>>> timeit.Timer('list2 = [i for i in list1]', 'list1 = range(10**3)').timeit(10**6)
95.697894811630249
切片语法是最快的。这比使用列表理解要快得多
要清除列表,可以使用:
del list1[:]
@potatocubed:给出的许多答案都解决了您给出的简单示例(“将列表1移动到列表2”),但没有真正解释更深层次问题的“原因”,即在迭代列表时修改列表。研究S.Lott的答案…第二个选项不会像你想象的那样有效(特别是因为你想删除列表1中的项目)@ChristopheD:对不起,我的答案不清楚。当我说将名称list2绑定到与list1相同的对象时,我假设OP会知道list2和list1都是同一对象的名称。@ChristopheD:试图让答案更清楚一些。但是有这么多答案——如果信息让OP忙的话,那么列表2也是['A','B','C']
。问题是:为什么有两个列表;-)@克里斯托弗:列表2没有改变-我只是检查了一下。正在创建一个新的列表对象并将其绑定到名称list1,而list2不受影响。@PreludeAndFugue:hmm,很好的一点(判断得太早,没有正确的思考)Python变量很棘手。即使在使用它很长时间后,我仍然需要偶尔提醒自己,它们只是指向内存中对象的名称。还有一个链接解释列表索引/切片(list[:]
是列表切片的一个示例):对downvoter:downvote的原因?如果我的帖子中有错误,我想知道它是什么,以便我可以为将来学习。感谢所有的帮助人员-这是一个很好的简明解释我做错了什么,以及几个修复选项,我现在将匆匆离开并尝试实施。=)