2013-10-12 4 views
0

Bonjour, j'ai le code suivant qui fait une liste d'adjacence pour un graphe, qui imprime le code très bien, sauf lors de l'ajout de nouvelles valeurs à va et vb, les anciennes clés sont écrasées. Si je trouve que le sommet 0 est adjacent à 1 et 2, je veux ajouter les deux, mais à la place 1 est écrasé par 2. Aussi j'ai essayé d'utiliser d'autres méthodes d'insertion et j'ai l'erreur 0, qui est aucune clé dans le dictionnaire cet index:Python Dict, insertion dynamique

def caminhografo(grafo, va, vb): 
    vat = vertex 
    i = 0 
    a = 0 
    z = 0 
    va = int(va) 
    vb = int(vb) 
    x = len(grafo.node) 
    if va < vb: 
     for va in range (vb+1): 
      a = 0 
      x = len(grafo.node) 
      for a in range (x): 
       if [int(va),int(a)] in grafo.node: 
        vat.adj[va] = a 

    if va > vb: 
     while vb > va: 
      a = 0 
      x = len(grafo.node) 
      for a in range (x): 
       if[int(vb),int(a)] in grafo.node: 
        vat.adj[vb] = a 
      vb = vb - 1 
    print (vat.adj) 

Comment puis-je insérer dynamiquement dans les clés correctement?

est ici Vertex et grafo est une classe graphique:

class graph: 
    v = 0 
    a = 0 
    node = [] 

class vertex: 
    adj = {} 

Merci pour toute aide.

+2

Comment '' 'va va> vb' fonctionne avec' while vb> va'? J'aurais pensé que tu ne pourrais jamais entrer dans la boucle. – hughdbrown

+0

Quel type d'objet est 'vat.adj'? 'vat' semble être une référence à une variable globale' vertex', mais cela ne m'aide pas. – Blckknght

+0

cela fonctionne si l'entrée est dans cette condition, va et vb vient soit plus haut que l'autre ou pas du tout. C'est juste un peu de faire l'inverse de la première pour. – Rex

Répondre

0

L'utilisation de defaultdict a fait le travail.

from collections import defaultdict 

Ensuite, au lieu d'utiliser le sommet de la classe, je simplement créé une defaultdict (liste):

vat = defaultdict(list) 

Après cela, en utilisant append sur elle a fait l'affaire:

vat[va].append(a)

Il Il semble que créer une dictée de listes avec force brute n'a pas fonctionné, car l'appendice ne se produirait pas. Mais en utilisant un dictionnaire par défaut des listes de l'importation résolu ce problème.

0

vous pouvez déclarer chaque valeur de vat.adj comme une liste vat.adj[i] = [], et faire vat.adj[vb].append(a)

note que vous devez initialiser chaque élément vat.adj comme une liste pour tout ce que vous vertex.

for i in range(n): 
    vat.adj[i] = [] 
+0

Si j'avais les arcs suivants: [[0, 1], [1, 0], [0, 2], [2, 0]] il va imprimer: {0: [2, 2], 1: [0, 0], 2: [0, 0]} ce qui signifie qu'il a écrasé le 0: [1,1] aussi il imprime l'index qui n'aide pas. – Rex

+0

vous voulez dire quand vous faites 'vat.adj [0] .append (1)', il écrase '0: [2,2]' à 0: [1,1] '? –

+0

Je reçois l'erreur suivante si j'utilise ajouter: AttributeError: 'int' objet n'a pas d'attribut 'append' c'est l'append: vat.adj [va] .append (a) – Rex