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)
range实际上是一个半封闭的功能.因此,结束值不会包含在结果范围内.
如果X = 2,则Xi的可能值可以是0,1和2
在你的代码,range(X)只会给0和1,如果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)
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)