擅长:python、mysql、java
<p>这不起作用的原因是<code>remove</code>只是删除了第一个匹配的元素。您可以通过反复调用<code>remove</code>直到它不再存在来解决这个问题,例如,将您的<code>if</code>更改为<code>while</code>,如下所示:</p>
<pre><code>while i in projects:
print 'PROJECTS', projects
print 'DEL', self.get_arguments('del[]')
projects.remove(i)
</code></pre>
<p>但一般来说,使用<code>remove</code>是个坏主意,尤其是当您已经搜索了元素时。现在你只是重复搜索,以便删除它。除了明显的低效率之外,还有很多情况下,您最终会尝试删除<code>i</code>的第三个实例(因为这就是您找到的实例),但实际上会删除第一个实例。这只会让你的代码更难推理。您只需在列表上迭代一次并在执行时删除,就可以提高复杂性和效率。你知道吗</p>
<p>但即使这样也过于复杂,效率仍然很低,因为每次从列表中删除时,都会移动列表中的所有其他元素。使用<code>filter</code>或列表理解,从要保留的值构建一个新列表几乎总是更简单的:</p>
<pre><code>arguments = set(self.get_arguments('del[]'))
projects = [project for project in projects if project not in arguments]
</code></pre>
<p>将<code>arguments</code>生成一个集合在这里并不是<em>必要的</em>,但它在概念上更清晰—您不关心参数的顺序,也不需要保留任何重复项,而且更有效的集合可以立即测试成员身份,而不是通过比较每个元素。你知道吗</p>