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'
4

2 回答 2

1

另一种方法如下:

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

range在此代码段中换出xrange不会破坏它。使用可选的 step 参数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]

尽管如此,我还是建议不要使用 step 从 range 中分割返回的列表,而是使用可用于 range 和 xrange 的可选 step 参数!

于 2015-05-03T02:42:45.567 回答
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版本崩溃的原因。

于 2015-05-03T02:34:49.827 回答