0
votes

Comment convertir une liste de paires en un dictionnaire avec chaque élément en tant que clé d'une liste de valeurs appariées?

Je fais des cours qui impliquent des graphiques. J'ai des listes d'Edge E = [('A', 'B'), ('A', ',', ',', ', ",", "," D "), (' B '," C ") etc.] et Je veux une fonction pour les convertir en matrices d'adjacence sous la forme de dictionnaires {'A': ['B', 'C', 'D'], 'B': ['A', "," Alors que je Peut utiliser une fonction qui saisit uniquement ces dictionnaires.

Mon problème principal est que je ne peux pas comprendre comment utiliser une boucle pour ajouter des touches: valeurs sans simplement écraser les listes. Une version précédente de ma fonction sortirait [] comme toutes les valeurs car 'f' n'a aucune connexion.

J'ai essayé ceci: xxx

edgelisttadjmat (V, e) sorties: xxx

alors qu'il devrait produire: xxx


0 commentaires

6 Réponses :


0
votes

La logique de ce que vous essayez d'atteindre est en fait assez simple: xxx pré>

résultat: p> xxx pré>

pour chaque élément de v code>, effectuez un chèque pour voir si cet élément existe dans n'importe quel tuple dans E code>. S'il existe, alors prenez l'élément qui forment une paire sur ce tuple et ajoute à une liste temporaire. Après avoir vérifié tous les éléments de E code>, mettez à jour le résultat code> Dictionnaire et passez à l'élément suivant de V code> jusqu'à ce que vous soyez terminé. P>

Pour revenir à votre code, vous devez le modifier comme suit: P>

def EdgeListtoAdjMat(V,E):
    GA={}
    conneclist=[]
    for i in range(len(V)):
        for j in range(len(V)):
            # Checking if a pair of two different elements exists in either format inside E. 
            if not i==j and ((V[i],V[j]) in E or (V[j],V[i]) in E):
                conneclist.append(V[j])
        GA[V[i]]=conneclist
        conneclist = []
    return(GA)


0 commentaires

0
votes

Une approche plus efficace consiste à parcourir les bords et à ajouter à la dicte de sortie des énumérations des sommets dans les deux sens. Utilisez dict.setdefault pour initialiser chaque nouvelle clé avec une liste. Et lorsque les itérations sur les bords finissent, itérer sur le reste des sommets qui ne sont pas encore dans la sortie de sortie pour les affecter des listes vides: xxx

de sorte que cela donne: xxx

EDGelistToadjmat (v, e)) retournerait: xxx


0 commentaires

0
votes

Puisque vous avez déjà votre liste de sommets dans V, il est facile de préparer un dictionnaire avec une liste vide de connexions. Ensuite, passez simplement dans la liste des bords et ajoutez-le à la matrice de chaque côté:

V = ['a','b','c','d','e','f']
E = [('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]

GA = {v:[] for v in V}
for v1,v2 in E:
    GA[v1].append(v2)
    GA[v2].append(v1)


0 commentaires

0
votes

Je pense que votre code n'est pas très pythonique, vous pouvez écrire un code plus lisible qui est plus simple à déboguer et aussi plus rapide que vous utilisez les bibliothèques intégrées de Python et l'indexation de Numpy. xxx


0 commentaires

0
votes

Si vous envisagez d'utiliser une bibliothèque, NetworkX code> est conçu pour ce type de problèmes de réseau:

import networkx as nx 

V = ['a','b','c','d','e','f']
E = [('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]

G=nx.Graph(E)
G.add_nodes_from(V)
GA = nx.to_dict_of_lists(G)

print(GA)

# {'a': ['c', 'b', 'd'], 'c': ['a', 'b', 'd'], 'b': ['a', 'c', 'd'], 'e': [], 'd': ['a', 'c', 'b'], 'f': []}


0 commentaires

0
votes

Vous pouvez convertir la liste des bords sur la carte en utilisant itheroTools.groupby xxx


0 commentaires