Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating 2D coordinates map in Python

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.

like image 657
aemdy Avatar asked Jan 31 '12 16:01

aemdy


People also ask

How do you input points in Python?

The input() function automatically converts the user input into string. We need to explicitly convert the input using the type casting. raw_input() - The raw_input function is used in Python's older version like Python 2.


2 Answers

Using itertools.product():

from itertools import product
coordinates = list(product(xrange(width), xrange(height)))
like image 145
Andrew Clark Avatar answered Oct 15 '22 00:10

Andrew Clark


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.

like image 20
senderle Avatar answered Oct 14 '22 23:10

senderle