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

时间:2016-01-19 09:43:20

标签: python list list-comprehension

XYZ是长方体的三个坐标。

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

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

到目前为止,我已经编写了以下代码,并将输出显示为:

[[0, 0, 0]]

然而预期的输出是

[[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 1]]

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

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

6 个答案:

答案 0 :(得分:8)

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

  

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

在您的代码中,如果range(X)为2,0将只提供1X。您应该使用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]]

您可以使用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]]

答案 1 :(得分:1)

itertools.productlist 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]]

答案 2 :(得分:0)

试试这个:

    x = int(input())
    y = int(input())
    z = int(input())
    n = int(input())
    ans=[[i,j,k] for i in range(x+1) for j in range(y+1) for k in range(z+1) if i+j+k !=n]
    print(ans)

因为范围函数不包括结束值并且停在第(n-1)个位置所以如果我们在这里使用范围(X)它将仅得到0因此应该使用+1来打印列表词典增加顺序。

答案 3 :(得分:0)

x = int(input())
y = int(input())
z = int(input())
n = int(input())
result = []

for i in range(x+1):
   for j in range(y+1):
       for k in range(z+1):
           if((x+y+z) != 1):
              arr = [i,j,k]
              result.append(arr)
print(result)

答案 4 :(得分:0)

我们必须使用列表推导,并要注意,因为范围函数终止于第x个值,所以我应该在0到x + 1的范围内,这也适用于j和k。预期的输出应为[i,j,k]格式。

enter code here
x = int(input())
y = int(input())
z = int(input())
n = int(input())
i=0
#print(i)
j=0
#print(j)
k=0
#print(k) 
sum=x+y+z
output=[]
output=[[i,j,k] 
for i in range(0,x+1) 
for j in range(0,y+1) 
for k in range(0,z+1) if i+j+k !=  n] 
print(output)

答案 5 :(得分:0)

x = 1
y = 1
z = 2
n = 3

arr_3_D = []

for i in range(x+1):
    for j in range(y+1):
        for k in range(z+1):
            if i+j+k != n:
                arr = [i,j,k]
                arr_3_D.append(arr)


print(arr_3_D)

输出:[[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 1, 0], [0, 1, 1], [1, 0 , 0], [1, 0, 1], [1, 1, 0], [1, 1, 2]]