Создание 2D карты координат в Python - PullRequest
12 голосов
/ 31 января 2012

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

Мне нужно создать список кортежей из 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-й.

Ответы [ 3 ]

15 голосов
/ 31 января 2012

Использование itertools.product():

from itertools import product
coordinates = list(product(xrange(width), xrange(height)))
5 голосов
/ 31 января 2012

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

((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 все в порядке.

1 голос
/ 31 января 2012

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

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

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

@F.J 0.27s

Так что да, его ответ самый лучший.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...