在defaultdict中把一个元素放在正确的位置
Put an element in the right position in defaultdict
大家好,我是 python 的新手,我正在尝试创建我的第一个程序来查找具有 +1 符号的节点集群。我有一个包含 3 列的文件(起始节点、结束节点、节点之间的符号),如下所示:
1 2 1
1 3 1
2 3 1
2 4 -1
2 5 1
3 6 -1
4 7 -1
4 9 -1
我创建图表并将所有邻接项保存在字典中。现在我想在另一个字典(defaultdict(list))中保存所有超级节点(它们之间有+1符号的团队节点)。所以我写了下面的代码:
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():
我在这里停止代码,因为我不知道如何将元素放在 dict 的正确位置。我想做的步骤是:
我有这样的超级节点:
1 : [1,2,3,5]
2 : [4]
3 : [6,8]
等等
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
您想使用 collections.defaultdict
的任何特定原因?
无论您使用 deafaultdict
还是常规 dict
,您都可以使用以下代码找到您的超级节点。 setdefault
方法适用于两者。查看 setdefault
的作用 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)
[edit] 查看图表的图形并了解 OP 想要的内容,这是一种方法:
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
是一组列表,其中每组节点是图片中的一个 blob。
大家好,我是 python 的新手,我正在尝试创建我的第一个程序来查找具有 +1 符号的节点集群。我有一个包含 3 列的文件(起始节点、结束节点、节点之间的符号),如下所示:
1 2 1
1 3 1
2 3 1
2 4 -1
2 5 1
3 6 -1
4 7 -1
4 9 -1
我创建图表并将所有邻接项保存在字典中。现在我想在另一个字典(defaultdict(list))中保存所有超级节点(它们之间有+1符号的团队节点)。所以我写了下面的代码:
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():
我在这里停止代码,因为我不知道如何将元素放在 dict 的正确位置。我想做的步骤是: 我有这样的超级节点:
1 : [1,2,3,5]
2 : [4]
3 : [6,8]
等等
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
您想使用 collections.defaultdict
的任何特定原因?
无论您使用 deafaultdict
还是常规 dict
,您都可以使用以下代码找到您的超级节点。 setdefault
方法适用于两者。查看 setdefault
的作用 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)
[edit] 查看图表的图形并了解 OP 想要的内容,这是一种方法:
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
是一组列表,其中每组节点是图片中的一个 blob。