<ol>
<li><p><strong>两个列表的交集:</strong></p>
<p>您已经知道解决方案:<code>set(A) & set(B)</code>。或者,等价地,<code>set(A).intersection(B)</code>。在</p>
<pre><code>>>> A = [('x1', 'y1'), ('x2', 'y2'), ('x3', 'y3')]
>>> B = [('x1', 'y1'), ('x2', 'y5'), ('x4', 'y4')]
>>> set(A).intersection(B)
{('x1', 'y1')}
</code></pre></li>
<li><p><strong>只有(x,y)[0]匹配的两个列表的交集:</strong></p>
<p>首先,确保<code>A</code>和{<cd4>}都按它们的x坐标排序。在</p>
<p>然后使用<a href="https://docs.python.org/dev/library/itertools.html#itertools.groupby" rel="nofollow">itertools.groupby()</a>和字典:</p>
^{pr2}$
<p>(这和你问的不太一样,因为,正如你所见,我们用<code>('x1', {'y1'})</code>而不是{<cd6>}。另外,我们有集合而不是列表,但这两个问题都是很容易修复的。)</p>
<p>如果要排除公共点:请在调用groupby()之前从<code>A</code>和<code>B</code>中删除它们:</p>
<pre><code>>>> A = set(A)
>>> B = set(B)
>>> common_points = A & B
>>> A = [point for point in A if point not in common_points]
>>> B = [point for point in B if point not in common_points]
</code></pre></li>
<li><p><strong>列表<code>B</code>与<code>A</code>的唯一性,仅在<code>(x,y)[0]</code>上比较:</strong></p>
<p>构造<code>A</code>中所有点的x坐标集:</p>
<pre><code>>>> exclude = {point[0] for point in A}
>>> [point for point in B if point[0] not in exclude]
[('x4', 'y4')]
</code></pre>
<p>注意,<code>exclude</code>的元素是<code>a_grouped</code>的键,这意味着您可以重用上一个问题中的部分代码并编写:</p>
<pre><code>>>> [point for point in B if point[0] not in a_grouped]
[('x4', 'y4')]
</code></pre></li>
</ol>
<p>对于所有这些解决方案,性能和可读性都可以提高,如果您要使用我的代码,请考虑这一点。在</p>