El siguiente artículo es una traducción de una pregunta en StackOverflow del usuario algui91, que preguntaba Build a List of Lists eficiently in python. La respuesta es del usuario Roland.



Hace tiempo me encontré con el problema de tener que construir una lista de la forma más eficiente posible, sin usar bucles for, ya que era el código de una MetaHeurística y debía evaluarse miles de veces. el código original era el siguiente:

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)])

Y yo quería eliminar el bucle y hacer la expresión lo más compacta y eficiente posible. Como siempre, en Stack Overflow encontré mi respuesta, usando compresión de listas (list comprehensions):

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]]

Espero que sirva de ayuda a alguien que busque conseguir algo similar.

Fuente