如何使用图论合并具有重叠元素的列表?

Susan Sarandon
发布: 2024-10-21 17:14:02
原创
105 人浏览过

How to Merge Lists with Overlapping Elements Using Graph Theory?

将列表与共享元素合并:图论方法

给定一组列表,其中一些包含重叠元素,目标是将它们合并到一组列表中,其中包含原始列表中完整的唯一元素集。例如,考虑以下列表的输入列表:

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中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!