我创建一个包含0到131072之间数字的列表:
x = [i for i in range(131072)]
然后是所有对,除了相同数字的对:
pairs = []
append_pairs = pairs.append
for i in range(len(x)):
for j in range(len(x)):
if x[i]!=x[j]:
x2 = [x[i], x[j]]
append_pairs(x2)
给出:
pairs = [[0, 1], [0, 2], [0, 3], ... [131071, 131070]]
但是在这种语法中需要很长时间。可以更快地完成吗?
答案 0 :(得分:2)
你可以使用itertools.combinations
,但这可能还需要一段时间:
import itertools as it
n = 131072
pairs = it.combinations(range(n), 2)
请注意,上面的代码不会给出所有对的列表,而是一对生成器对的列表:
>>> pairs
<itertools.combinations at 0x7fb939a72a48>
您可以使用
获取列表pairs = list(it.combinations(range(n), 2)
使用numpy可能更快:
import numpy as np
pairs = np.transpose(np.triu_indices(n, 1))
但是,您想要生成的对数很大,并且您无法将数字存储在内存中(除非您拥有功能非常强大的计算机)。特别是,您获得n * (n - 1) / 2
对。如果将数字存储为8字节整数,那么你看到的内存不到70 GB。
n = 5000
:
注意:因为有更多内置代码可用,所以我生成了不同的对。