Maison > développement back-end > Tutoriel Python > Comment fusionner des listes avec des éléments qui se chevauchent à l'aide de la théorie des graphes ?

Comment fusionner des listes avec des éléments qui se chevauchent à l'aide de la théorie des graphes ?

Susan Sarandon
Libérer: 2024-10-21 17:14:02
original
197 Les gens l'ont consulté

How to Merge Lists with Overlapping Elements Using Graph Theory?

Fusionner des listes avec des éléments partagés : une approche théorique des graphes

Étant donné une collection de listes, dont certaines contiennent des éléments qui se chevauchent, l'objectif consiste à les consolider dans un ensemble de listes comprenant l'ensemble complet des éléments uniques des listes d'origine. Par exemple, considérons la liste de listes d'entrée suivante :

L = [['a', 'b', 'c'], ['b', 'd', 'e'], ['k'], ['o', 'p'], ['e', 'f'], ['p', 'a'], ['d', 'g']]
Copier après la connexion

La tâche consiste à fusionner les listes qui partagent des éléments communs jusqu'à ce qu'aucune liste ne puisse plus être combinée. Le résultat souhaité serait :

L = [['a', 'b', 'c', 'd', 'e', 'f', 'g', 'o', 'p'], ['k']]
Copier après la connexion

Bien que des opérations booléennes et des boucles while puissent être utilisées, une approche plus efficace peut être trouvée en visualisant les listes sous forme de graphique. Dans une représentation graphique, chaque liste correspond à un ensemble de nœuds reliés par des arêtes. Par conséquent, le problème se traduit par la recherche des composants connectés dans ce graphique.

Une solution consiste à utiliser NetworkX, une bibliothèque robuste pour l'analyse de graphiques, comme démontré ci-dessous :

<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>
Copier après la connexion

En tirant parti de la puissance de la théorie des graphes, NetworkX gère efficacement la tâche, garantissant l'exactitude et l'efficacité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal