<p>您可以创建一个包含列表的字典来捕获连接:</p>
<pre><code>connections = {}
for topic, (conns, some_number) in data:
for conn in conns:
connections.setdefault(conn, set()).add(topic)
</code></pre>
<p>这将连接值映射到主题集。你知道吗</p>
<p>现在可以查找反向连接;如果顺序不重要,只需获取所有连接值集的并集:</p>
<pre><code>output = [tuple(set().union(*(connections[c] for c in conns)))
for topic, (conns, some_number) in data]
</code></pre>
<p>演示:</p>
<pre><code>>>> data = [('topic1', (['apples', 'oranges'], 0.14975108213820515)),
... ('topic2', (['oranges', 'raisins'], 0.14975108213820515)),
... ('topic3', (['grapes', 'raisins'], 0.14975108213820515)),
... ('topic4', (['trees', 'flowers'], 0.14975108213820515))]
>>> connections = {}
>>> for topic, (conns, some_number) in data:
... for conn in conns:
... connections.setdefault(conn, set()).add(topic)
...
>>> [tuple(set().union(*(connections[c] for c in conns)))
... for topic, (conns, some_number) in data]
[('topic1', 'topic2'), ('topic1', 'topic3', 'topic2'), ('topic3', 'topic2'), ('topic4',)]
>>> from pprint import pprint
>>> pprint(_)
[('topic1', 'topic2'),
('topic1', 'topic3', 'topic2'),
('topic3', 'topic2'),
('topic4',)]
</code></pre>
<p>否则,先从集合中移除<code>topic</code>到前面:</p>
<pre><code>output = [(topic,) + tuple(set().union(*(connections[c] for c in conns)) - {topic})
for topic, (conns, some_number) in data]
>>> [(topic,) + tuple(set().union(*(connections[c] for c in conns)) - {topic})
... for topic, (conns, some_number) in data]
[('topic1', 'topic2'), ('topic2', 'topic1', 'topic3'), ('topic3', 'topic2'), ('topic4',)]
>>> pprint(_)
[('topic1', 'topic2'),
('topic2', 'topic1', 'topic3'),
('topic3', 'topic2'),
('topic4',)]
</code></pre>