在python中有效地构建列表

时间:2014-04-13 08:58:19

标签: python list matrix

我有以下代码:

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是不可能的,因为循环体有多个语句。

3 个答案:

答案 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不同)。