Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在移除项的列表中迭代,某些项不会被移除_Python_List - Fatal编程技术网

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的原因?如果我的帖子中有错误,我想知道它是什么,以便我可以为将来学习。感谢所有的帮助人员-这是一个很好的简明解释我做错了什么,以及几个修复选项,我现在将匆匆离开并尝试实施。=)