<p>另一次尝试:</p>
<pre><code>lst = [
('A', 'B'),
('B', 'C'),
('A', 'C'),
('B', 'D'),
('D', 'E'),
]
d = {}
for i, j in lst:
d.setdefault(i, []).append(j)
d.setdefault(j, []).append(i)
from itertools import combinations
rv, seen_segments, seen_vertices = [], set(), set()
for k, v in d.items():
if len(v) == 1:
segment = set((k, v[0])).difference(seen_vertices)
seen_vertices.update(segment)
rv.append([tuple(segment), ])
else:
graph = []
for i, j in combinations([k] + v, 2):
if not j in d[i]:
break
else:
graph.append(tuple(sorted((i, j))))
else:
if graph:
graph = [segment for segment in graph if segment not in seen_segments]
seen_segments.update(graph)
if graph:
rv.append(graph)
from pprint import pprint
pprint(rv)
</code></pre>
<p>印刷品:</p>
<pre><code>[[('A', 'B'), ('A', 'C'), ('B', 'C')], [('D', 'E')]]
</code></pre>
<hr/>
<p>用于输入</p>
<pre><code>lst = [
('A', 'B'),
('B', 'C'),
]
</code></pre>
<p>印刷品:</p>
<pre><code>[[('A', 'B')], [('C',)]]
</code></pre>
<hr/>
<p>输入:</p>
<pre><code>lst = [
('A', 'B'),
('B', 'C'),
('C', 'D'),
]
</code></pre>
<p>印刷品:</p>
<pre><code>[[('B', 'A')], [('D', 'C')]]
</code></pre>