2017-11-24 1 views
1

Hallo ich bin neu zu Python und ich versuche, mein erstes Programm zu finden Cluster von Knoten, die +1 Zeichen haben. Ich habe eine Datei mit 3 Spalten (Startknoten, Knoten endet, Zeichen zwischen den Knoten) wie folgt aus:Setzen Sie ein Element an der richtigen Stelle in defaultdict

1 2 1 
1 3 1 
2 3 1 
2 4 -1 
2 5 1 
3 6 -1 
4 7 -1 
4 9 -1 

Ich schaffe das Diagramm ein i speichern alle adjacencies in einem Wörterbuch. Jetzt möchte ich in einem anderen Wörterbuch (defaultdict (Liste)) alle Supernodes (Team-Knoten, die +1 Zeichen zwischen ihnen haben) speichern. Also schrieb ich den folgenden Code:

G = nx.Graph() 
G = nx.read_edgelist('example.txt', delimiter='\t', nodetype=int, data=(('sign', int),)) 
adjacencies = {} 
supernodes = defaultdict(list) 

for i in G.nodes: 
    adjacencies[i] = list(G.neighbors(i)) 


flag = 0 
if flag == 0: 
    for node in G.nodes: 
     supernodes[node].append(node) 
     flag = 1 
     break 
else: 
    for i in G.nodes(): 
     for j in adjacencies[i]: 
      if G.get_edge_data(i,j) == 1: 
       for v in supernodes.values(): 

ich den Code hier aufhören, weil ich weiß nicht, wie man die richtige Position von dict ein Element zu setzen. Die Schritte, die ich tun möchte, sind: ich habe Superknoten wie:

1 : [1,2,3,5] 
2 : [4] 
3 : [6,8] 

etc

1. check if edge(i,j) is +1 and then 
2.  if i is in supernodes then add j in the same list where i is 
3.  if j is in supernodes then add i in the same list where j is 
4.  if i and j is not in supernodes the add a new list in supernodes and add 
     i,j elements 

Antwort

1

einen bestimmten Grund, den Sie verwenden collections.defaultdict wollen?

Sie können den folgenden Code verwenden, um Ihre Superknoten zu finden, unabhängig davon, ob Sie eine deafaultdict oder eine reguläre dict verwenden. Die Methode setdefault funktioniert in beiden. Überprüfen Sie, was setdefault tut here.

G = nx.read_edgelist('example.txt', delimiter='\t', nodetype=int, data=(('sign', int),)) 

supernodes = dict() 
for edge in G.edges(data='sign'): 
    sign = edge[2] 
    if sign == 1: 
     node1 = edge[0] 
     node2 = edge[1] 
     supernodes.setdefault(node1, [node1]) 
     supernodes.setdefault(node2, [node2]) 
     supernodes[node1].append(node2) 
     supernodes[node2].append(node1) 

[bearbeiten] in der Figur des Graphen Blick und das Verständnis, was OP wollte, ist hier ein Weg, es zu tun:

import networkx as nx 

G = nx.read_edgelist('example.txt', delimiter='\t', nodetype=int, data=(('sign', int),)) 
G1 = nx.Graph() 
G1.add_weighted_edges_from([edge for edge in G.edges(data='sign') if edge[2]==1]) 
G1.add_nodes_from(list(G.nodes)) 
supernodes = list(nx.connected_components(G1)) 

supernodes ist eine Liste von Sätzen, wobei jeder Satz von Knoten ist eine Blob in Ihrem Bild.

+0

Dies berechnet die Nachbarn von jedem Knoten, der +1 Zeichen hat. Ich versuche etwas anderes zu machen. Ich habe dieses Diagramm hier: [link] (http://images.slideplayer.com/12/3525987/slides/slide_24.jpg) und ich muss Superknoten finden. Die Supernodes im Graphen sind die Blobs. –

+0

um ganz ehrlich zu sein Sie Frage ist irreführend. Siehe Bearbeiten, um das zu erhalten, was Sie die Menge der Superknoten nennen. – rodgdor

Verwandte Themen