今晚我已经做了很长时间的工作.但我遇到了一个简单的障碍.任何人都可以告诉我为什么这段代码按照它的方式工作?
我有两个清单.我希望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]
为什么?
我怎样才能完成我的需要?
当您修改正在迭代的序列时,它将产生意外的结果.我这样做,利用快速set操作.
list2 = list(set(list2) - set(list1))
Run Code Online (Sandbox Code Playgroud)
这是否是比使用列表理解更快或更慢取决于大小list1和list2,以及是否可以让一进一出set的多次初始化的一部分,而不是在一个循环.
迭代时不要修改列表.
你想要什么可以用列表理解直接表达:
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)
| 归档时间: |
|
| 查看次数: |
140 次 |
| 最近记录: |