python 的偶数六边形网格生成器

Even-only hexagonal grid generator for python

我正在尝试制作 "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'

在发布问题时,我计算出了我想要的生成器:

>>> [[(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 版本崩溃了。

另一种方法如下:

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

在此代码段中将 range 换成 xrange 不会破坏它。在 range 上使用可选的 step 参数比获得完整范围并对其进行切片要好。


切片xrange失败原因的解释:

在Python2.x中,调用xrangereturn一种特殊类型的xrange对象,而调用rangereturn普通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 return是一个支持更多操作的列表:

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

不过,我建议只使用可选的 step 参数,而不是使用一个步骤从 range 中切出 returned 列表!