将列表与共享元素合并:图论方法
给定一组列表,其中一些包含重叠元素,目标是将它们合并到一组列表中,其中包含原始列表中完整的唯一元素集。例如,考虑以下列表的输入列表:
L = [['a', 'b', 'c'], ['b', 'd', 'e'], ['k'], ['o', 'p'], ['e', 'f'], ['p', 'a'], ['d', 'g']]
任务是合并共享公共元素的列表,直到无法组合更多列表。所需的输出将是:
L = [['a', 'b', 'c', 'd', 'e', 'f', 'g', 'o', 'p'], ['k']]
虽然可以使用布尔运算和 while 循环,但可以通过将列表视为图形来找到更有效的方法。在图形表示中,每个列表对应于一组由边连接的节点。因此,问题转化为找到该图中的连接组件。
一种解决方案涉及利用 NetworkX,这是一个强大的图分析库,如下所示:
<code class="python">import networkx from networkx.algorithms.components.connected import connected_components def to_graph(l): G = networkx.Graph() for part in l: # each sublist is a bunch of nodes G.add_nodes_from(part) # it also imlies a number of edges: G.add_edges_from(to_edges(part)) return G def to_edges(l): """ treat `l` as a Graph and returns it's edges to_edges(['a','b','c','d']) -> [(a,b), (b,c),(c,d)] """ it = iter(l) last = next(it) for current in it: yield last, current last = current G = to_graph(l) print(connected_components(G)) # prints [['a', 'c', 'b', 'e', 'd', 'g', 'f', 'o', 'p'], ['k']]</code>
通过利用强大的功能根据图论,NetworkX 有效地处理了任务,保证了正确性和效率。
以上是如何使用图论合并具有重叠元素的列表?的详细内容。更多信息请关注PHP中文网其他相关文章!