这个python列表删除循环有什么问题?

tkn*_*man 4 python loops list

今晚我已经做了很长时间的工作.但我遇到了一个简单的障碍.任何人都可以告诉我为什么这段代码按照它的方式工作?

我有两个清单.我希望list2只包含不在list1中的数字.从逻辑上讲,这似乎应该有效.但它完全没有.为什么?

list1 = [1,2,3,4,5,6,7,8]
list2 = [12,15,16,7,34,23,5,23,76,89,9,45,4]


for ch in list2:
    if ch in list1:
         list2.remove(ch)

return list2
Run Code Online (Sandbox Code Playgroud)

不知怎的,这回来了:[15,7,5,23,76,9,4]

为什么?

我怎样才能完成我的需要?

Mic*_*man 9

当您修改正在迭代的序列时,它将产生意外的结果.我这样做,利用快速set操作.

list2 = list(set(list2) - set(list1))
Run Code Online (Sandbox Code Playgroud)

这是否是比使用列表理解更快或更慢取决于大小list1list2,以及是否可以让一进一出set的多次初始化的一部分,而不是在一个循环.


ham*_*ene 5

迭代时不要修改列表.

你想要什么可以用列表理解直接表达:

list2 = [ch for ch in list2 if ch not in list1]
Run Code Online (Sandbox Code Playgroud)

它更具可读性,与具有集合的解决方案不同,它不会从list2中删除重复项或更改项目顺序.

更新:当list1很大时,从它创建一个集合实际上会加快速度:

list2 = [ch for ch in list2 if ch not in set(list1)]
Run Code Online (Sandbox Code Playgroud)