Python的仅限六边形网格生成器

3
我正在尝试使用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'
2个回答

1
另一种方法是以下内容:

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

在这段代码中将range替换为xrange不会破坏它。使用可选的步骤参数来代替获取整个范围并对其进行切片更加好用。


解释为什么切片xrange失败:

在Python 2.x中,调用xrange返回一个特殊类型的xrange对象,而调用range返回普通的Python列表:

>>> xrange(10)
xrange(10)
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
< p > 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]

然而,与其使用步长切片返回的列表,我建议只使用可选的步长参数,它将适用于range和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 版本会崩溃。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接