首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何生成一对随机整数的列表?

如何生成一对随机整数的列表?
EN

Stack Overflow用户
提问于 2015-10-14 19:42:13
回答 6查看 3.1K关注 0票数 1

我对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!

编辑

为了让你对我的意思有一个直观的理解,这里有两个图像。第一个是正则网络(又称格),第二个是随机网络。第一个边列表是手动创建的,以便复制国际象棋表,而第二个边列表显示的是第一个棋盘的(手动)洗牌对应项。正如您所看到的,节点保持在完全相同的位置。希望这能帮助更多的人。谢谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-10-14 20:02:58

对于列表创建,您可以执行如下操作:

代码语言:javascript
复制
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)]

要断言其中包含所有的值,可以执行以下操作

代码语言:javascript
复制
vals = set([v for tup in my_edge_list for v in tup])
assert all([v in vals for v in original_values])

断言将确保在边中有正确的表示形式。只要尽你最大的努力确保你没有击中断言,你就可以做几件事。

  1. 示例,不需要从整数列表中替换,直到它们全部消失,创建一个“基本网络”,然后随机添加更多到您心中的愿望。
  2. 使n_edges足够高,很可能您的条件将得到满足。如果不再试一次..。

实际上取决于您将使用网络的用途以及您希望它具有什么样的结构。

编辑:我已经更新了我的响应,使其对任意的值列表更加健壮,而不是需要一个顺序列表。

票数 0
EN

Stack Overflow用户

发布于 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

您可以将图表构建为:

代码语言:javascript
复制
S = complete_graph_from_list(map(lambda x: str(x), range(0,1000)))
print S.edges()
票数 1
EN

Stack Overflow用户

发布于 2015-10-14 20:04:15

Python内置了名为迭代工具的库。下面是您如何实现您提到的内容的示例:

代码语言:javascript
复制
import itertools

list = [3, 4, 6, 7]
sublist_length = 2
comb = itertools.combinations(list, sublist_length)

这将返回梳状作为迭代器。

您可以执行comb.next()来获取迭代器中的下一个元素,也可以按如下所示在for循环上进行迭代以获得所有结果。

代码语言:javascript
复制
for item in comb:
    print item

哪一项应产出:

代码语言:javascript
复制
(3, 4),
(3, 6),
(3, 7),
(4, 6),
(4, 7),
(6, 7),

我希望这能解决你的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33134205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档