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. P>
J'ai essayé ceci: p> edgelisttadjmat (V, e) sorties: p> alors qu'il devrait produire: p>
6 Réponses :
La logique de ce que vous essayez d'atteindre est en fait assez simple: résultat: p> pour chaque élément de Pour revenir à votre code, vous devez le modifier comme suit: P> 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>
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)
Une approche plus efficace consiste à parcourir les bords et à ajouter à la dicte de sortie des énumérations des sommets dans les deux sens. Utilisez de sorte que cela donne: p> dict.setdefault code> 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:
EDGelistToadjmat (v, e)) code> retournerait: p>
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)
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.
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': []}
Vous pouvez convertir la liste des bords sur la carte en utilisant itheroTools.groupby code>