我有以下代码:
neig = []
for _ in xrange(number):
r = random.randint(0,self._tam-1)
s = random.randint(0,self._tam-1)
neig.append([r,s, self.deltaC(r, s)])
我试图使用map
,一个生成器或其他东西来摆脱for循环以优化列表的构建。我已经检查了this answer,但在我的情况下,我需要为元素赋值。
是否可以使用生成器并将呼叫延迟到deltaC
?我认为使用map
是不可能的,因为循环体有多个语句。
答案 0 :(得分:1)
尝试使用列表推导;
In [1]: import random
In [2]: number = 20
In [3]: tam = 13
In [4]: r = [random.randint(0, tam) for _ in range(number)]
In [5]: s = [random.randint(0, tam) for _ in range(number)]
In [6]: zip(r, s)
Out[6]: [(3, 12), (6, 12), (7, 12), (5, 1), (1, 0), (4, 12), (4, 5), (6, 2), (10, 6), (6, 11), (12, 6), (10, 2), (5, 2), (3, 2), (3, 11), (13, 2), (0, 2), (7, 0), (9, 13), (0, 12)]
In [7]: def deltaC(a, b):
...: return a + b
...:
In [8]: neig = [[p, q, deltaC(p, q)] for p, q in zip(r, s)]
In [9]: neig
Out[9]: [[3, 12, 15], [6, 12, 18], [7, 12, 19], [5, 1, 6], [1, 0, 1], [4, 12, 16], [4, 5, 9], [6, 2, 8], [10, 6, 16], [6, 11, 17], [12, 6, 18], [10, 2, 12], [5, 2, 7], [3, 2, 5], [3, 11, 14], [13, 2, 15], [0, 2, 2], [7, 0, 7], [9, 13, 22], [0, 12, 12]]
答案 1 :(得分:1)
您可以使用generator expression:
neig = ((r, s, self.deltaC(r, s))
for r, s in ([random.randint(0,self._tam-1),
random.randint(0,self._tam-1)]
for _ in xrange(number)))
如果您只需要迭代neig
一次。
这将延迟调用self.deltaC(r, s)
,直到neig
被迭代为止需要它们。
答案 2 :(得分:1)
我推荐的最好方法是使用numpy:
import numpy as np
r, s = np.random.randint(0, self._tam, (2, number))
neig = np.concatenate([r, s, self.deltaC(r, s)])
这假定deltaC
可以编写为接受r
&{39}和s
的向量,这应该非常简单。请注意,np.random.randint
在上限是独占的(与random.randint
不同)。