如何生成包含随机整数对的列表?

时间:2015-10-14 19:42:14

标签: python list random neural-network networkx

我是Python和NetworkX的新手。我需要创建一个类似于Edgelist=[(0,1),(0,3),(1,0),(1,2),(1,4),(2,1),(2,5)]的列表,这些元素表示边缘(链接)的起始和结束节点,而这些节点又是网络的一部分。

我不想手动设置它们,而是希望Python通过从指定的值范围(即(start,end))中随机选择0, 999的整数值来创建您在列表中看到的对,其中表示节点ID。然后,我想确保每个节点ID至少包含在一系列(开始,结束)值中(这意味着我的所有节点将连接到至少一个其他节点

我知道我可以使用random.randint(0, 999),但我不知道如何"筑巢"它创建一个列表(也许是for循环?)。我希望我有一些代码可以告诉你,但这是我第一次尝试使用NetworkX!

修改

为了让您直观地了解我的意思,这里有两张图片。第一个是常规网络(又称格子),第二个是随机网络。第一个边缘列表是手动创建的,以便重现国际象棋桌,而第二个边缘列表显示边缘列表,该边缘列表是第一个的(手动)混洗对应物。 如您所见,节点保存在完全相同的位置。希望这会有所帮助。谢谢! enter image description here enter image description here

6 个答案:

答案 0 :(得分:1)

有一个类似的答案,但有关 - How to generate a fully connected subgraph from node list using python's networkx module

的完整图表

在您的情况下,使用zubinmehta' answer

import networkx
import itertools

def complete_graph_from_list(L, create_using=None):
    G = networkx.empty_graph(len(L),create_using)
    if len(L)>1:
        if G.is_directed():
            edges = itertools.permutations(L,2)
        else:
            edges = itertools.combinations(L,2)
        G.add_edges_from(edges)
    return G

您可以将图表构建为:

S = complete_graph_from_list(map(lambda x: str(x), range(0,1000)))
print S.edges()

答案 1 :(得分:1)

Python内置了一个名为 itertools 的库。 以下示例如何实现您提到的内容:

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),

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

答案 2 :(得分:1)

这是一个networkx命令,它将创建一个图形,使每个节点只有一条边:

import networkx as nx
G = nx.configuration_model([1]*1000)

如果您查看它的内容,它会执行以下操作来回答您的问题 - 每个节点都会出现在完全一个边缘。

import random
mylist = random.suffle(range(start,end))
edgelist = []
while mylist:
    edgelist.append((mylist.pop(),mylist.pop()))

在进行弹出之前,您应该保证mylist的长度均匀。

答案 3 :(得分:0)

random.seed(datetime.datetime.now()) 

from random import randint
# ot generate 100 tuples with randints in range 0-99
li = [(randint(0,99),randint(0,99)) for i in range(100)]
print(li)

[(80, 55), (3, 10), (66, 65), (26, 23), (8, 72), (83, 25), (24, 99), (72, 9), (52, 76), (72, 68), (67, 25), (72, 18), (94, 62), (7, 62), (49, 94), (29, 89), (11, 38), (52, 51), (19, 32), (20, 85), (56, 61), (4, 40), (97, 58), (82, 2), (50, 82), (77, 5), (2, 9), (2, 46), (39, 4), (74, 40), (69, 15), (1, 77), (45, 58), (80, 59), (85, 80), (27, 80), (81, 4), (22, 33), (77, 60), (75, 87), (43, 36), (60, 34), (90, 54), (75, 3), (89, 84), (51, 93), (62, 64), (81, 50), (15, 60), (33, 97), (42, 62), (83, 26), (13, 33), (41, 87), (29, 63), (4, 32), (6, 14), (79, 73), (95, 4), (41, 16), (96, 64), (15, 28), (35, 13), (35, 82), (77, 16), (63, 27), (75, 37), (11, 52), (21, 35), (37, 96), (9, 86), (83, 11), (5, 42), (34, 32), (17, 8), (65, 55), (58, 19), (90, 40), (18, 75), (29, 14), (0, 11), (25, 68), (34, 52), (22, 8), (12, 53), (16, 49), (73, 54), (78, 80), (74, 60), (40, 68), (69, 20), (37, 38), (74, 60), (53, 90), (25, 48), (44, 52), (49, 27), (28, 35), (29, 94), (35, 60)]

答案 4 :(得分:0)

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

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])

断言将确保您的边缘具有正确的表示。至于尽力确保你没有打击那个断言,你可以做几件事。

  1. 样本没有从您的整数列表中替换,直到他们全部去创建一个"基础网络"然后随意添加更多的心灵欲望
  2. 使n_edges足够高,很可能会满足您的条件。如果不再试一次......
  3. 真的取决于你将要使用网络的内容以及你希望它拥有什么样的结构

    编辑:我已将我的回复更新为对任意值列表更加健壮,而不是需要顺序列表

答案 5 :(得分:-1)

这是一个首先生成随机节点(pop1),然后将其混合(pop2)并将它们组合成一对列表的解决方案。

注意:此方法仅产生顶点,其中每个节点恰好start一次,end恰好一次,所以可能不是你所追求的。请参阅下面的另一种方法

import random, copy

random.seed() # defaults to time.time() ...
# extract a number of samples - the number of nodes you want
pop1 = random.sample(xrange(1000), 10)
pop2 = copy.deepcopy( pop1 )
random.shuffle( pop2 )
# generate pairs from the same population - this guarantees your constraint
pairs = zip( pop1, pop2 )

print pairs

输出:

[(17, 347), (812, 688), (347, 266), (731, 342), (342, 49), (904, 17), (49, 731), (50, 904), (688, 50), (266, 812)]

这是另一种方法

这允许重复出现节点。 我们的想法是从同一群体中绘制startend个节点:

import random
random.seed()
population = range(10) # any population would do
# choose randomly from the population for both ends
# so you can have duplicates
pairs = [(random.choice(population), random.choice(population) for _ in xrange(100)]
print pairs[:10]

输出:

[(1, 9), (7, 1), (8, 6), (4, 7), (6, 2), (7, 3), (0, 2), (1, 0), (8, 3), (8, 3)]