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

2024-04-29 16:51:43 发布

您现在位置:Python中文网/ 问答频道 /正文

今晚我在一个很长的节目上工作了很长时间。但我遇到了一个简单的障碍。有人能告诉我为什么这个代码是这样工作的吗?你知道吗

我有两张单子。我希望列表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]

为什么?你知道吗

我怎样才能完成我所需要的?你知道吗


Tags: 代码in列表forif数字逻辑ch
3条回答

这是一个有趣的观点。让我解释一下为什么会这样。你知道吗

在python中使用for a in list时,python按顺序查看列表的元素1、元素2等。所以它首先看12,然后去掉它。然后看元素2,除了15是元素1,16是元素2。移除16个。所以15个从来没有被检查过,被留在名单上。然后它同样跳过7并删除34。。。你知道吗

避免这种情况的方法当然是不要迭代从中删除元素的同一个列表。你可以复制第二张单子。检查此副本中的成员是否在第一个列表中。如果不是,请将其从第二个列表中删除。我相信已经发布的一些建议会对你有用。这就是解释。你知道吗

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

list2 = list(set(list2) - set(list1))

这比使用列表理解更快还是更慢取决于list1list2的大小,以及是否可以将一个作为初始化的一部分而不是在循环中多次生成set。你知道吗

迭代列表时不要修改它。你知道吗

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

list2 = [ch for ch in list2 if ch not in list1]

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

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

list2 = [ch for ch in list2 if ch not in set(list1)]

相关问题 更多 >