今晚我在一个很长的节目上工作了很长时间。但我遇到了一个简单的障碍。有人能告诉我为什么这个代码是这样工作的吗?你知道吗
我有两张单子。我希望列表2只包含不在列表1中的数字。 从逻辑上讲,这似乎应该奏效。但它确实起作用了。为什么?你知道吗
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
不知何故,这会带来: [15,7,5,23,76,9,4]
为什么?你知道吗
我怎样才能完成我所需要的?你知道吗
这是一个有趣的观点。让我解释一下为什么会这样。你知道吗
在python中使用
for a in list
时,python按顺序查看列表的元素1、元素2等。所以它首先看12,然后去掉它。然后看元素2,除了15是元素1,16是元素2。移除16个。所以15个从来没有被检查过,被留在名单上。然后它同样跳过7并删除34。。。你知道吗避免这种情况的方法当然是不要迭代从中删除元素的同一个列表。你可以复制第二张单子。检查此副本中的成员是否在第一个列表中。如果不是,请将其从第二个列表中删除。我相信已经发布的一些建议会对你有用。这就是解释。你知道吗
当您修改您正在迭代的序列时,它将产生意外的结果。我会这样做,它利用了快速的
set
操作。你知道吗这比使用列表理解更快还是更慢取决于
list1
和list2
的大小,以及是否可以将一个作为初始化的一部分而不是在循环中多次生成set
。你知道吗迭代列表时不要修改它。你知道吗
你想要什么可以用列表理解直接表达:
它更具可读性,并且与具有集合的解决方案不同,它不会从list2中删除重复项或更改项目顺序。你知道吗
更新:当list1很大时,从中创建一个集合实际上会加快速度:
相关问题 更多 >
编程相关推荐