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中,调用xrange
return一种特殊类型的xrange对象,而调用range
return普通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 列表!
我正在尝试制作 "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中,调用xrange
return一种特殊类型的xrange对象,而调用range
return普通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 列表!