Python 连接相对节点
我在networkx中有两个长度相等且彼此平行的线图,如何在这些图上循环并用两条边连接相对的节点,即连接2&2a、3&3a等Python 连接相对节点,python,python-2.7,networkx,Python,Python 2.7,Networkx,我在networkx中有两个长度相等且彼此平行的线图,如何在这些图上循环并用两条边连接相对的节点,即连接2&2a、3&3a等 nodes1 = [2,5,7,8,9,10] nodes2 = ['2a','5a','7a','8a','9a','10a'] 我试过了 for k in range (0, len(nodes1)): for i in range (0, len(nodes2)): if nodes1.index(kk) == nodes2.index(
nodes1 = [2,5,7,8,9,10]
nodes2 = ['2a','5a','7a','8a','9a','10a']
我试过了
for k in range (0, len(nodes1)):
for i in range (0, len(nodes2)):
if nodes1.index(kk) == nodes2.index(i):
X.add_edge(k,i)
但它没有给出所需的输出,请任何人纠正我。谢谢
This is what I have
2---------3---------4----------5----------6
2a---------3a-------4a--------5a---------6a
This is what I want
2---------3---------4----------5-----------6
|| || || || ||
|| || || || ||
|| || || || ||
2a--------3a---------4a---------5a---------6a
很抱歉,如果上一篇文章不清楚,那么代码不能正常工作的原因是索引返回值所在列表中的索引,因此您正在从
0
循环到每个列表的长度,并且列表中不存在第一个值0
,这会引发ValueError
。请参阅在线文档:
如果您只是想创建元组对,并假设长度和顺序已经正确,那么如果您使用以下行修改代码:
for k in range (0, len(nodes1)):
X.add_edge(nodes1[k],nodes2[k])
如果要并行遍历这两个列表,则即使原始代码的index
没有引发ValueError
错误,也会导致5 x 5
条目,因为您为nodes2中的每个条目为node1
中的每个节点添加了一条边,这不是您想要的
假设两个列表的排序都匹配,那么您可以进行列表理解来创建边列表并从中创建图形
In [171]:
edge_list = [(nodes1[i], nodes2[i]) for i in range(len(nodes1))]
# I'm using python 3 so you could do the following also
# edge_list = list(zip(nodes1, nodes2))
G=nx.DiGraph()
G.add_edges_from(edge_list)
G.edges()
Out[171]:
[(2, '2a'), (5, '5a'), (7, '7a'), (8, '8a'), (9, '9a'), (10, '10a')]
编辑
如果要在两个方向上添加边,则只需通过交换列表的顺序来创建一个次边列表,如下所示:
In [194]:
edge_list_reversed = list(zip(nodes2, nodes1))
edge_list_reversed
G.add_edges_from(edge_list_reversed)
G.edges()
Out[194]:
[(2, '2a'),
(5, '5a'),
(7, '7a'),
(8, '8a'),
(9, '9a'),
(10, '10a'),
('2a', 2),
('8a', 8),
('9a', 9),
('5a', 5),
('10a', 10),
('7a', 7)]
使用方法
@Ed感谢代码片段的工作和您深思熟虑的评论。请问我将如何在这些节点之间添加双边缘。thanks@Nobi你的图是有向图吗?还是一个普通的图形?我会更新我的答案
>>>> zip(nodes1, nodes2)
[(2, '2a'), (5, '5a'), (7, '7a'), (8, '8a'), (9, '9a'), (10, '10a')]