擅长:python、mysql、java
<p>若要从约1000000个元组的列表中移除约10000个元组,如果这些值是可哈希的,则最快的方法应为:</p>
<pre><code>totoss = set((v,k) for (k,v) in myDict.iteritems())
myList[:] = [x for x in myList if x not in totoss]
</code></pre>
<p>该集合的准备是一个小的一次性成本,节省了做元组解包和重新打包,或元组索引,很多次。赋值给<code>myList[:]</code>而不是赋值给<code>myList</code>在语义上也很重要(如果有其他对<code>myList</code>的引用,仅仅重新绑定名称是不够的——您真的想重新绑定<em>内容</em>!-). </p>
<p>我没有你的测试数据来自己测量时间,唉!,但是,让我知道它是如何利用你的测试数据的!</p>
<p>如果值不可哈希(例如,它们是子列表),最快的可能是:</p>
<pre><code>sentinel = object()
myList[:] = [x for x in myList if myDict.get(x[0], sentinel) != x[1]]
</code></pre>
<p>或者(无论哪种方式都不应该有太大的区别,但我怀疑前一种方法更好——索引比解包和重新打包更便宜):</p>
<pre><code>sentinel = object()
myList[:] = [(a,b) for (a,b) in myList if myDict.get(a, sentinel) != b]
</code></pre>
<p>在这两种变体中,sentinel习惯用法用于防止<code>None</code>的值(这对于首选的基于集合的方法来说不是问题——如果值是散列的!)因为它将比<code>if a not in myDict or myDict[a] != b</code>(需要两个索引到myDict)便宜得多。</p>