使用Python中的列表推导查找长方体的坐标

H.B*_*rns 6 python list-comprehension list

X,Y并且Z是一个长方体的三个坐标.

现在X = 1,Y = 1,Z = 1且N = 2.

我必须在3D网格上生成所有可能坐标的列表,其中Xi + Yi + Zi的总和不等于N.如果X = 2,则Xi的可能值可以是0,1和2.同样适用到Y和Z.

到目前为止,我已经在下面的代码中写了这个代码,它输出的结果是:

[[0, 0, 0]]
Run Code Online (Sandbox Code Playgroud)

但预期的产量是

[[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)

下面是我的代码,我的代码出了什么问题?

[[x,y,z] for x in range(X) for y in range(Y) for z in range(Z) if x+y+z != N]
Run Code Online (Sandbox Code Playgroud)

the*_*eye 8

range实际上是一个半封闭的功能.因此,结束值不会包含在结果范围内.

如果X = 2,则Xi的可能值可以是0,1和2

在你的代码,range(X)只会给01,如果X是2,应该使用range(X + 1).

X, Y, Z, N = 1, 1, 1, 2
[[x,y,z] for x in range(X + 1) for y in range(Y + 1) for z in range(Z + 1) if x+y+z != N]

[[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)

你可以这样写itertools.product,就像这样

X, Y, Z, N = 1, 1, 1, 2
from itertools import product
[list(i) for i in product(range(X + 1), range(Y + 1), range(Z + 1)) if sum(i) != N]

[[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)


Ant*_*pov 2

itertools.product和的另一种方法list comprehension

In [91]: [list(l) for l in it.product([0,1], repeat=3) if sum(l) != 2]
Out[91]: [[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)