生成一个没有重复项的大型点列表

时间:2015-06-03 04:30:29

标签: python list random points

我想创建一个包含以下形式的20,000个点的大型列表:

[[x, y], [x, y], [x, y]]

其中x和y可以是0到1000之间的任意随机整数。我怎么能这样做,没有重复的坐标[x,y]?

4 个答案:

答案 0 :(得分:2)

你可以使用while循环来填充它,直到它足够大:

>>> from random import randint
>>> n, N = 1000, 20000
>>> points = {(randint(0, n), randint(0, n)) for i in xrange(N)}
>>> while len(points) < N:
...     points |= {(randint(0, n), randint(0, n))}
...     
>>> points = list(list(x) for x in points)

你最初的想法可能很慢,因为它是迭代列表来检查包含内容,即 O(n)。这使用更快的集合,然后在结束时仅转换为列表结构一次。

答案 1 :(得分:1)

试试这个:

import itertools
x = range(0,10)
aList =[]
for pair in itertools.combinations(x,2):
    for i in range(0,10):
        aList.append(pair)
print aList

如果你想要0-10之间的所有唯一点并存储在列表中, 或者您需要它随机顺序,然后使用一些随机函数。

答案 2 :(得分:0)

由于n = 1001在您的情况下相对较小,random.sample(population, k)会很好,从可能对的空间中随机抽取20000对(没有重复):

import random
print random.sample([[x, y] for x in xrange(1001) for y in xrange(1001)], 20000)

这是最简洁易读的解决方案。 (但如果n非常大,那么生成点的整个空间将不具有计算效率。)

答案 3 :(得分:0)

避免使用未知迭代计数的while循环并避免在内存中存储巨大list的方法是使用random.sample从单个range生成唯一编码值(在Py3中)或xrange(在Py2中)以避免实际产生巨大的临时数;一个简单的数学运算可以将“编码”值分成两个值:

import random
xys = random.sample(range(1001 * 1001), 20000)
[divmod(xy, 1001) for xy in xys] # Wrap divmod in list() if you must have list, not tuple