Creando mapa de coordenadas 2D en Python

No estoy buscando una solución, estoy buscando una mejor solución o simplemente una forma diferente de hacerlo utilizando algún otro tipo de comprensión de lista o alguna otra cosa.

Necesito generar una lista de tuplas de 2 enteros para obtener coordenadas de mapa como [(1, 1), (1, 2), …, (x, y)]

Así que tengo los siguientes:

width, height = 10, 5 

Solución 1

 coordinates = [(x, y) for x in xrange(width) for y in xrange(height)] 

Solucion 2

 coordinates = [] for x in xrange(width): for y in xrange(height): coordinates.append((x, y)) 

Solucion 3

 coordinates = [] x, y = 0, 0 while x < width: while y < height: coordinates.append((x, y)) y += 1 x += 1 

¿Hay alguna otra solución? Me gusta el primero.

Usando itertools.product() :

 from itertools import product coordinates = list(product(xrange(width), xrange(height))) 

La primera solución es elegante, pero también podría usar una expresión generadora en lugar de una lista de comprensión:

 ((x, y) for x in range(width) for y in range(height)) 

Esto podría ser más eficiente, dependiendo de lo que esté haciendo con los datos, ya que genera los valores sobre la marcha y no los almacena en ningún lugar.

Esto también produce un generador; en cualquier caso, tiene que usar la list para convertir los datos a una lista.

 >>> list(itertools.product(range(5), range(5))) [(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4)] 

Tenga en cuenta que si está usando Python 2, probablemente debería usar xrange , pero en Python 3, el range está bien.

ACTUALIZADO: Se agregó @FJ respuesta en el punto de referencia

La primera implementación es la forma más pythonica, y parece ser la más rápida, también. Usando 1000 para cada uno, ancho y alto, registro tiempos de ejecución de

  1. 0.35903096199s
  2. 0.461946964264s
  3. 0.625234127045s

@FJ 0.27s

Así que sí, su respuesta es la mejor.