2017-07-25 4 views
1
>>> import networkx as nx 
>>> g = nx.Graph() 
>>> g.add_nodes_from([1, 2, 3, 4, 5], carved=False) 
>>> g[1] 
{} 
>>> nx.get_node_attributes(g, "carved") 
{1: False, 2: False, 3: False, 4: False, 5: False} 
>>> 

Sollte ich nicht das "geschnitzte" Attribut bekommen, wenn ich 'g [1]' eintippe? Die folgenden Werke:NetworkX add_nodes_from funktioniert nicht wie erwartet

>>> g[1] 
{} 
>>> g[1]["carved"] = True 
>>> g[1] 
{'carved': True} 
>>> 

Was bin ich hier, warum nicht die „carve“ Attribut wie im zweiten Beispiel angewendet? Ich verwende Python 2.7 unter Windows. Ich habe meine Installation von NetworkX aktualisiert und dachte, dass ich vielleicht eine ältere Version hatte?

Jede Hilfe würde sehr geschätzt werden.

Antwort

1

Es sieht so aus, als ob Sie beabsichtigen, g.node[1] anstelle von g[1] zu verwenden.

0

TL/DR: Verwenden Sie g.node[u], um Attribute des Knotens u abzurufen. g[u] ist etwas ganz anderes.


Die zugrunde liegende Datenstruktur ist, dass g im Grunde ein Wörterbuch ist. Die Knoten sind Schlüssel von g, und wenn beispielsweise 1 ein Schlüssel von g ist, dann ist g[1] ein Wörterbuch, dessen Schlüssel die Nachbarn des Knotens 1 sind.

Also nach dem Platzieren der Knoten in g, haben Sie keine Kanten eingefügt. Die Tatsache, dass g[1] leer ist, spiegelt die Tatsache wider, dass 1 keine Nachbarn hat. Sobald Sie gehen und direkt auf die zugrunde liegende Datenstruktur bearbeiten, indem g[1]["carved"] = True Einstellung, werden Sie feststellen, dass jetzt g.neighbors(1) sind ['carved'], und dass g haben jetzt eine Kante zwischen 1 und 'carved' und dass Kante True Attribute (von g.edge[1]['carved']. Aber weil Sie direkt bearbeitet die Datenstruktur, g.nodes() nicht bewusst ist, dass 'carved' hat als Knoten erstellt. Dies ist eindeutig nicht das, was Sie wollen.

, sondern g.node[u] verwenden, um die Attribute des Knotens u und g.edge[u][v] zu bekommen jedes Attribut einer Kante zu bekommen aus u bis v.

Verwandte Themen