Создание карты 2D-координат в Python

Я не ищу решения, я ищу лучшее решение или просто другой способ сделать это, используя другое понимание списка или что-то еще.

Мне нужно сгенерировать список кортежей из 2 целых чисел, чтобы получить координаты карты, такие как [(1, 1), (1, 2),..., (x, y)]

Итак, у меня есть следующее:

width, height = 10, 5

Решение 1

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

Решение 2

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

Решение 3

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

Есть ли другие решения? Мне больше нравится 1-й.

Ответ 1

Используя itertools.product():

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

Ответ 2

Первое решение является элегантным, но вы также можете использовать выражение генератора вместо понимания списка:

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

Это может быть более эффективным, в зависимости от того, что вы делаете с данными, поскольку оно генерирует значения "на лету" и не хранит их нигде.

Это также создает генератор; в любом случае вам нужно использовать 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)]

Обратите внимание, что если вы используете Python 2, вы, вероятно, должны использовать xrange, но в Python 3, range в порядке.

Ответ 3

ОБНОВЛЕНО: Добавлено @F.J. ответ в тесте

Первая реализация - самый пифонический путь, и, похоже, она самая быстрая. Используя 1000 для каждой, ширины и высоты, я регистрирую время выполнения

  • 0.35903096199s
  • 0.461946964264s
  • 0.625234127045s

@F.J 0.27s

Итак, его ответ - лучший.