2016-01-19 2 views
5

X, Y und Z sind die drei Koordinaten eines Quaders.Finden Sie die Koordinaten eines Quaders mit Listenverständnis in Python

Jetzt X = 1, Y = 1, Z = 1 und N = 2.

Ich muss eine Liste aller möglichen Koordinaten auf einem 3D-Gitter generieren, wobei die Summe von Xi + Yi + Zi ungleich N ist. Wenn X = 2, können die möglichen Werte von Xi 0, 1 und 2 sein . das gleiche gilt für Y und Z.

ich dies so weit unten Code geschrieben haben, und es wird die Ausgabe als geben:

[[0, 0, 0]] 

jedoch die erwartete Ausgabe

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

nachfolgend finden ist mein Code, was geht Falsch in meinem Code?

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

Versuchen Sie, Bereich (1) '' zu drucken, und Sie können das Problem – M4rtini

Antwort

1

Ein weiterer approch mit itertools.product und 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 ist eigentlich eine halbgeschlossene Funktion. Daher wird der Endwert nicht in den resultierenden Bereich eingeschlossen.

Wenn X = 2, die möglichen Werte von Xi 0 sein können, 1 und 2

in Ihrem Code wird range(X) geben nur 0 und 1, wenn X 2. ist, sollten Sie verwendet haben 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]] 

können Sie das gleiche schreiben, mit itertools.product, wie diese

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

try this:

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) 

als Range-Funktion, die den Endwert nicht enthalten und hielt an (n -1) th Position, wenn wir Bereich (X) hier verwenden, wird es nur 0 Ergebnis daher +1 sollte verwendet werden, um die Liste in lexikographischer Reihenfolge zu drucken.

+0

sehen Bitte fügen Sie Erklärung um Ihre Antwort hinzu. – LordWilmore

+0

als Bereichsfunktion enthält nicht den Endwert und gestoppt an (n-1) ten Position, wenn wir also Bereich (X) verwenden, wird es nur 0 Ergebnis daher +1 verwendet werden, um die Liste in lexikographischer Reihenfolge zu drucken. @LordWilmore – ravishing