2015-05-03 3 views
3

Я пытаюсь сделать "even only" hex grid in Python.Даже только генератор гексагональной сетки для питона

Ожидаемый выход

[[(0,0), (2,0), (4,0), (6,0)], 
[(1,1), (3,1), (5,1), (7,1)], 
[(0,2), (2,2), (4,2), (6,2)], 
[(1,3), (3,3), (5,3), (7,3)]] 

я возился с этим:

>>> [[(x,y) for x in range(7)[::2]] for y in range(4)] 
[[(0,0), (2,0), (4,0), (6,0)], 
[(0,1), (2,1), (4,1), (6,1)], 
[(0,2), (2,2), (4,2), (6,2)], 
[(0,3), (2,3), (4,3), (6,3)]] 

Но следующий место, куда я отправился оттуда, исключение:

>>> [[(x,y) for x in xrange(y % 2, 6 + (y % 2))[::2]] for y in range(4)] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: sequence index must be integer, not 'slice' 

ответ

1

Другой способ сделать это состоит в следующем:

[zip(range(i % 2, 8, 2), (i,) * 4) for i in range(4)] 

Перестановка из range для xrange в этом фрагменте кода не будет нарушать его. Использование необязательного аргумента шага на range лучше, чем получить полный диапазон и разрезать его.


Объяснение почему нарезания xrange не удалось:

В Python 2.x, вызовы xrange возвращать специальный тип объекта xrange, в то время как вызовы range возвратные обычные списки Python:

>>> xrange(10) 
xrange(10) 
>>> range(10) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

Ошибка xrange, потому что вы не можете использовать срез-синтаксис с объектами xrange:

>>> xrange(10)[::2] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: sequence index must be integer, not 'slice' 

Но вы можете сделать это с range, поскольку range возвращает список, который поддерживает несколько операций:

>>> range(10)[::2] 
[0, 2, 4, 6, 8] 

Тем не менее, вместо того, нарезка возвращаемый список из диапазона с шагом, я бы рекомендуем просто использовать необязательный аргумент шага, который будет работать как с диапазоном, так и с xrange!

0

В проводке вопрос, я разработал генератор я хотел:

>>> [[(x,y) for x in range(8)[y % 2::2]] for y in range(4)] 
[[(0,0), (2,0), (4,0), (6,0)], 
[(1,1), (3,1), (5,1), (7,1)], 
[(0,2), (2,2), (4,2), (6,2)], 
[(1,3), (3,3), (5,3), (7,3)]] 

Я, однако, не знаю, почему версия xrange был сбой.