擅长:python、mysql、java
<p>有一种方法:</p>
<pre><code>>>> a_list = [('[', '1O '), ("'", '1B '),('hi', 'SDFD29384'), ('there','2398SDFDSF'),("'", '1B '), (']', '1C ')]
>>> b_list = [('[', '1O '), ("'", '1B '),("'", '1B '), (']', '1C ')]
>>> list(set(a_list) - set(b_list))
[('hi', 'SDFD29384'), ('there', '2398SDFDSF')]
</code></pre>
<p>另一种方法是:</p>
<pre><code>>>> [ x for x in a_list if x not in b_list ]
[('hi', 'SDFD29384'), ('there', '2398SDFDSF')]
</code></pre>
<p>另外两种可能性:</p>
<pre><code>>>> for x in b_list:
try:
a_list.remove(x)
except ValueError:
pass
</code></pre>
<p>这个函数实际上修改了<code>a_list</code>,因此根据上下文的不同,可能并不理想。有一种类似的方法涉及<code>set.remove()</code>甚至<code>set.discard()</code>(不需要<code>try</code>块)。你知道吗</p>
<p>请注意,任何基于<code>set</code>的方法都要求列表中的所有对象都是可散列的—在给出的示例中,它们都是元组,所以这很好。<code>set</code>方法中的另一个警告是,结果中幸存的项可能与原始项的顺序不同。使用<code>OrderedSet</code>可以解决这个问题,但是会带来更多的开销,因为这不是一个核心包/数据类型。你知道吗</p>