我想创建一个包含以下形式的20,000个点的大型列表:
[[x, y], [x, y], [x, y]]
其中x和y可以是0到1000之间的任意随机整数。我怎么能这样做,没有重复的坐标[x,y]?
答案 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