web-dev-qa-db-fra.com

Vérifier si un nœud avec la même étiquette existe dans networkx en python

J'utilise le code suivant pour construire mon graphique en utilisant networkx comme suit.

mylist = [('chocolate_pudding', 6.3), ('tim_tam', 178.5), ('bread', 3.5), 
('chocolate_pudding', 8.5), ('tim_tam', 3.0), ('butter', 204.0)]

G = nx.Graph()

for ele in mylist:
    #if node with ele[0] does not exists, add the new node
         G.add_node(ele[0], weight=ele[1])
    #else, update the weight with the new weight value (weight = existing_weight + ele[1])

Je souhaite vérifier si le nœud portant le même libellé existe avant de créer un nouveau nœud. Si le nœud existe, je souhaite mettre à jour son poids en ajoutant la nouvelle valeur à la valeur existante.

Par exemple, dans l'exemple ci-dessus, je veux seulement 4 nœuds chocolate_pudding, tim_tam, bread, butter et leur poids doit être 14.8, 181.5, 3.5, 204.0 respectivement.

Je n'ai pas trouvé de manière appropriée de le faire dans networkx. par conséquent s'il vous plaît laissez-moi savoir s'il est possible de le faire dans networkx?

6
J Cena

Vous pouvez utiliser ele[0] in G pour vérifier si une étiquette ele[0] y est déjà. La mise à jour des valeurs est plutôt simple. 

import networkx as nx
mylist = [('chocolate_pudding', 6.3), ('tim_tam', 178.5), ('bread', 3.5), ('chocolate_pudding', 8.5), ('tim_tam', 3.0), ('butter', 204.0)]

G = nx.Graph()

for ele in mylist: 
     if ele[0] not in G:
         G.add_node(ele[0], weight=ele[1])
     else:
         new_weight = G.nodes[ele[0]]["weight"] + ele[1]
         # set values
         G.node[ele[0]]["weight"] = new_weight

G.nodes(data=True)        
# NodeDataView({'chocolate_pudding': {'weight': 14.8}, 
#               'tim_tam': {'weight': 181.5}, 
#               'bread': {'weight': 3.5}, 
#               'butter': {'weight': 204.0}})

Edit: / Cette réponse est basée sur networkx 2.0. Il semble qu'avant networkx 2.0, nodes ne soit qu'une fonction plutôt qu'un attribut. Par conséquent, vous devrez peut-être consulter la documentation pour savoir comment mettre à jour les nœuds. Je suppose que G.nodes(data=True)[ele[0]]["weight] = new_weight fonctionnerait. Ou checkout la fonction set_node_attributes

7
Tai

Je pense que le moyen le plus simple est de calculer ces valeurs avant de construire le graphique

from collections import defaultdict
import networkx as nx

mylist = [('chocolate_pudding', 6.3), ('tim_tam', 178.5), ('bread', 3.5), 
('chocolate_pudding', 8.5), ('tim_tam', 3.0), ('butter', 204.0)]

d = defaultdict(int)

for n, w in mylist:
    d[n] += w

G = nx.Graph()

for n, w in d.items():
    G.add_node(n, weight=w)

print(nx.get_node_attributes(G, 'weight'))
# {'chocolate_pudding': 14.8, 'tim_tam': 181.5, 'bread': 3.5, 'butter': 204.0}
2
Patrick Haugh