生成此类列表的pythonic方法是什么?(n立方体的面)

rho*_*ron 5 python geometry tuples list

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)]
Run Code Online (Sandbox Code Playgroud)

基本上,返回2n符合上述规范的元组列表.上面的代码适用于我的目的,但我想看到一个适用于所有n的函数??(仅用于教化).包括tuple([0]*n)在答案中是可以接受的.

我正在使用它来生成测量多面体的面的方向.对于所有方向,我可以使用list(itertools.product(*[(0, -1, 1)]*n)),但我无法想出一些非常简洁的东西,只有面部方向.

fal*_*tru 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())
Run Code Online (Sandbox Code Playgroud)
>>> 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)]
Run Code Online (Sandbox Code Playgroud)