Creating 2D coordinates map in Python

29,117

Solution 1

Using itertools.product():

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

Solution 2

The first solution is elegant, but you could also use a generator expression instead of a list comprehension:

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

This might be more efficient, depending on what you're doing with the data, because it generates the values on the fly and doesn't store them anywhere.

This also produces a generator; in either case, you have to use list to convert the data to a list.

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

Note that if you're using Python 2, you should probably use xrange, but in Python 3, range is fine.

Share:
29,117

Related videos on Youtube

aemdy
Author by

aemdy

Updated on July 09, 2022

Comments

  • aemdy
    aemdy over 1 year

    I'm not looking for solution, I'm looking for a better solution or just a different way to do this by using some other kind of list comprehension or something else.

    I need to generate a list of tuples of 2 integers to get map coordinates like [(1, 1), (1, 2), ..., (x, y)]

    So I have the following:

    width, height = 10, 5
    

    Solution 1

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

    Solution 2

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

    Solution 3

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

    Are there any other solutions? I like the 1st one most.

    • hochl
      hochl almost 12 years
      I'm fairly sure solution 1 is the best you can come up with.
  • cheeken
    cheeken almost 12 years
    itertools is a computational saviour.
  • asthasr
    asthasr almost 12 years
    +1. I would put it in a function, so that you can just pass in width and height and get the list back.
  • Niklas R
    Niklas R almost 12 years
    Using xrange in the itertools.product class would be more memory efficient, like F.J. did.
  • senderle
    senderle almost 12 years
    @NiklasR, assuming this is Python 2. If it's Python 3, xrange no longer exists. Adding a note though.
  • aemdy
    aemdy almost 12 years
    Well, I've just done some testing and got the following: creating a generator by list comprehension without [] is the fastest way, but if we are looping through the data afterwards then your method is much faster. Thanks!:)
  • LWZ
    LWZ over 10 years
    I assume the first implementation is F.J.'s itertools solution? And you should provide better descriptions for the numbers.

Related