我对Python和NetworkX相当陌生。我需要创建一个类似于Edgelist=[(0,1),(0,3),(1,0),(1,2),(1,4),(2,1),(2,5)]的列表,其中的元素表示边缘(链接)的开始和结束节点,而边缘(链接)又是网络的一部分。
我不希望Python手动设置它们,而是通过从指定的值范围(即(start,end) )中随机选择表示节点I的值(即0, 999)来创建列表中看到的配对。然后,我希望确保每个节点ID至少在一系列(开始值、结束值)中包含一次(这意味着我的所有节点将至少连接到另一个节点)。
我知道我可以使用random.randint(0, 999),但我不知道如何将它“嵌套”到创建列表中(可能是for循环?)。我希望我有一些代码给你看,但这是我第一次尝试使用NetworkX!
编辑
为了让你对我的意思有一个直观的理解,这里有两个图像。第一个是正则网络(又称格),第二个是随机网络。第一个边列表是手动创建的,以便复制国际象棋表,而第二个边列表显示的是第一个棋盘的(手动)洗牌对应项。正如您所看到的,节点保持在完全相同的位置。希望这能帮助更多的人。谢谢!


发布于 2015-10-14 20:02:58
对于列表创建,您可以执行如下操作:
import random
max = 999
min = 0
original_values = range(min, max) # could be arbitrary list
n_edges = # some number..
my_edge_list = [(random.choice(original_values), random.choice(original_values))
for _ in range(n_edges)]要断言其中包含所有的值,可以执行以下操作
vals = set([v for tup in my_edge_list for v in tup])
assert all([v in vals for v in original_values])断言将确保在边中有正确的表示形式。只要尽你最大的努力确保你没有击中断言,你就可以做几件事。
实际上取决于您将使用网络的用途以及您希望它具有什么样的结构。
编辑:我已经更新了我的响应,使其对任意的值列表更加健壮,而不是需要一个顺序列表。
发布于 2015-10-14 20:03:14
除了如何使用python的networkx模块从节点列表生成完全连接的子图上的一个完整图外,还有一个类似的答案。
导入networkx导入迭代工具def complete_graph_from_list(L,create_using=None):g= networkx.empty_graph(len(L),create_using)如果len(L)>1:如果G.is_directed():create_using= itertools.permutations(L,2),否则:create_using= itertools.combinations(L,2) G.add_edges_from(边)返回G
您可以将图表构建为:
S = complete_graph_from_list(map(lambda x: str(x), range(0,1000)))
print S.edges()发布于 2015-10-14 20:04:15
Python内置了名为迭代工具的库。下面是您如何实现您提到的内容的示例:
import itertools
list = [3, 4, 6, 7]
sublist_length = 2
comb = itertools.combinations(list, sublist_length)这将返回梳状作为迭代器。
您可以执行comb.next()来获取迭代器中的下一个元素,也可以按如下所示在for循环上进行迭代以获得所有结果。
for item in comb:
print item哪一项应产出:
(3, 4),
(3, 6),
(3, 7),
(4, 6),
(4, 7),
(6, 7),我希望这能解决你的问题。
https://stackoverflow.com/questions/33134205
复制相似问题