<p>在python中,multiset是以<a href="https://docs.python.org/3/library/collections.html#collections.Counter" rel="nofollow">counter</a>的形式提供的,因为您有同一个hashable对象的多个实例,因此您应该考虑使用它。你知道吗</p>
<p>这里是减号和联接列表</p>
<pre><code>def list_sub(list1, list2):
result = Counter(list1)
result.subtract(list2)
return result.elements()
def list_join(list1,list2):
test = set(list2)
return filter(lambda x: x in test,list1)
#return (x for x in list1 if x in test)
</code></pre>
<p>两者都返回对结果的迭代器,在python2中使用<a href="https://docs.python.org/2/library/itertools.html#itertools.ifilter" rel="nofollow">itertools.ifilter</a>或生成器表达式的效果相同</p>
<pre><code>>>> list(list_sub(list1,list2))
[1, 2, 2, 4, 4, 6]
>>> list(list_sub(list2,list1))
[3, 9, 9]
>>> list(list_join(list1,list2))
[1, 1, 3, 5, 8]
>>> list(list_join(list2,list1))
[3, 5, 3, 8, 1]
>>>
</code></pre>
<p>现在比较一下这个版本和@mhawke版本(使用mhawke的相同脚本)</p>
<p>在Python3中</p>
<pre><code>>python3 -m timeit -s 'import test' 'list(test.list_sub_counter(test.list1, test.list2))'
10 loops, best of 3: 274 msec per loop
>python3 -m timeit -s 'import test' 'list(test.list_sub(test.list1, test.list2))'
10 loops, best of 3: 199 msec per loop
</code></pre>
<p>在python2中</p>
<pre><code>>python2 -m timeit -s 'import test' 'list(test.list_sub_counter(test.list1, test.list2))'
10 loops, best of 3: 627 msec per loop
>python2 -m timeit -s 'import test' 'list(test.list_sub(test.list1, test.list2))'
10 loops, best of 3: 558 msec per loop
</code></pre>
<p>在这两种情况下,这个版本都更好,除了我在<em>defaultdict</em>和<em>Counter</em>中得到相同的结果之外,所以在python2中使用<code>defaultdict(int)</code>,在python3中使用<code>Counter</code></p>