if n == 1: return [(-1,), (1,)]
if n == 2: return [(-1,0), (1,0), (0,-1), (0,1)]
if n == 3: return [(-1,0,0), (1,0,0), (0,-1,0), (0,1,0), (0,0,-1), (0,0,1)]
基本上,返回符合上述规范的2n
元组列表。上面的代码适用于我的目的,但我希望看到一个适用于所有n∈ℕ的函数(仅用于启发)。在答案中包含tuple([0]*n)
是我可以接受的。
我正在使用它来生成测量多面体的面的方向。对于所有方向,我可以使用list(itertools.product(*[(0, -1, 1)]*n))
,但我无法想出一些非常简洁的内容,仅适用于面部方向。
答案 0 :(得分:5)
def faces(n):
def iter_faces():
f = [0] * n
for i in range(n):
for x in (-1, 1):
f[i] = x
yield tuple(f)
f[i] = 0
return list(iter_faces())
>>> faces(1)
[(-1,), (1,)]
>>> faces(2)
[(-1, 0), (1, 0), (0, -1), (0, 1)]
>>> faces(3)
[(-1, 0, 0), (1, 0, 0), (0, -1, 0), (0, 1, 0), (0, 0, -1), (0, 0, 1)]
答案 1 :(得分:3)
[tuple(sign * (i == p) for i in range(n)) for p in range(n) for sign in (-1, 1)]
普通for
,没有隐含的bool
→int
等价物:
for p in range(n):
for sign in (-1, 1):
yield tuple((sign if i == p else 0) for i in range(n))
答案 2 :(得分:3)
我看到这个问题的方法是两个同时交错n
大小的移位寄存器
>>> def shift_register(n):
l1 = (-1,) + (0,)*(n - 1)
l2 = (1,) + (0,)*(n - 1)
while any(l1):
yield l1
yield l2
l1 = (0,) + l1[:-1]
l2 = (0,) + l2[:-1]
>>> list(shift_register(3))
[(-1, 0, 0), (1, 0, 0), (0, -1, 0), (0, 1, 0), (0, 0, -1), (0, 0, 1)]
答案 3 :(得分:3)
使用numpy
的解决方案:
>>> a = numpy.identity(3, dtype=int)
>>> numpy.hstack((a, -a)).reshape(6, 3)
array([[ 1, 0, 0],
[-1, 0, 0],
[ 0, 1, 0],
[ 0, -1, 0],
[ 0, 0, 1],
[ 0, 0, -1]])
答案 4 :(得分:2)
>>> set(itertools.permutations([1] + [0]*(n-1))) | set(itertools.permutations([-1] + [0]*(n-1)))