<p>如果我能正确理解你的问题,我认为这是一个相当有效的方法。这里的结果是一个集合列表。在</p>
<p>也许缺少的知识是<code>d & g</code>(也写了<code>d.intersection(g)</code>)来寻找集合交集,以及在Python中一个空集是“错误的”</p>
<pre><code>data = [[1,2,3],[3,4],[5,6,7],[1,8,9,10]]
result = []
for d in data:
d = set(d)
matched = [d]
unmatched = []
# first divide into matching and non-matching groups
for g in result:
if d & g:
matched.append(g)
else:
unmatched.append(g)
# then combine all matching groups into one group
# while leaving unmatched groups intact
result = unmatched + [set().union(*matched)]
print(result)
# [set([5, 6, 7]), set([1, 2, 3, 4, 8, 9, 10])]
</code></pre>
<p>我们从根本不分组开始(<code>result = []</code>)。然后我们从数据中提取第一个列表。然后我们检查哪些<em>现有的</em>组与该列表相交,哪些不相交,然后将所有这些匹配的组与列表</em>合并(从<code>matched = [d]</code>开始实现)。我们不涉及不匹配的组(尽管其中一些可能会在以后的迭代中被合并)。如果您在每个循环中添加一行<code>print(result)</code>,您应该能够看到它是如何构建的。在</p>
<p><code>matched</code>中所有集合的并集由<code>set().union(*matched)</code>计算。供参考:</p>
<ul>
<li><a href="https://stackoverflow.com/q/2151517/553404">Pythonic Way to Create Union of All Values Contained in Multiple Lists</a></li>
<li><a href="https://stackoverflow.com/q/2921847/553404">What does the Star operator mean?</a></li>
</ul>