2016-01-19 13 views
5

X, Y e Z sono le tre coordinate di un parallelepipedo.Trova le coordinate di un parallelepipedo usando la comprensione degli elenchi in Python

Ora X = 1, Y = 1, Z = 1 e N = 2.

Devo generare un elenco di tutte le possibili coordinate su una griglia 3D in cui la somma di Xi + Yi + Zi non è uguale a N. Se X = 2, i valori possibili di Xi possono essere 0, 1 e 2 . lo stesso vale per Y e Z.

ho scritto questo codice sotto finora, e si sta dando l'uscita come:

[[0, 0, 0]] 

tuttavia l'output previsto è

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

sotto è il mio codice, che cosa è andare sbagliato nel mio codice?

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

Provare a 'stampare intervallo (1) 'e potrebbe essere visualizzato il problema – M4rtini

risposta

1

Un'altra approch con itertools.product e 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]] 
8

range è in realtà una funzione socchiusa. Quindi, il valore finale non sarà incluso nell'intervallo risultante.

Se X = 2, i possibili valori di Xi può essere 0, 1 e 2

Nel codice, range(X) darà solo 0 e 1, se X è 2. Si dovrebbe hanno usato 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]] 

È possibile scrivere la stessa, con itertools.product, come questo

>>> 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]] 
0

provare questo:

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) 

come la funzione gamma non include il valore finale e si fermò al numero (n -1) th posizione quindi se usiamo range (X) qui risulterà solo 0 quindi +1 dovrebbe essere usato per stampare la lista in ordine crescente lessicografico.

+0

Si prega di aggiungere una spiegazione alla risposta. – LordWilmore

+0

come funzione di intervallo non include il valore finale e si ferma a (n-1) posizione quindi se usiamo intervallo (X) qui risulterà solo 0 quindi +1 dovrebbe essere usato per stampare la lista in ordine crescente lessicografico. @LordWilmore – ravishing

Problemi correlati