2016-01-19 7 views
5

X, Y i Z są trzema współrzędnymi prostopadłościanu.Znaleźć współrzędne prostopadłości używając zrozumienia list w Pythonie

Teraz X = 1, Y = 1, Z = 1 i N = 2.

Muszę wygenerować listę wszystkich możliwych współrzędnych na siatce 3D, gdzie suma Xi + Yi + Zi nie jest równa N. Jeśli X = 2, możliwe wartości Xi mogą wynosić 0, 1 i 2 . to samo odnosi się do Y i Z.

pisałem to poniżej kod do tej pory, a to daje wyjście jak:

[[0, 0, 0]] 

jednak oczekiwany wynik jest

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

poniżej jest mój kod, co jest grane źle w moim kodzie?

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

Spróbuj "wydrukować zakres (1)" i możesz zobaczyć problem. – M4rtini

Odpowiedz

1

Innym approch z itertools.product i 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 jest rzeczywiście funkcja pół-zamknięte. Tak więc wartość końcowa nie zostanie uwzględniona w wynikowym zakresie.

Jeśli X = 2, możliwe wartości Xi może być 0, 1 i 2

W kodzie range(X) dadzą tylko 0 i 1, jeśli X to 2. Należy użyłeś 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]] 

Możesz napisać to samo, z itertools.product, tak

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

spróbuj tego:

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) 

jako funkcja zakres nie obejmuje wartość końcową i zatrzymał się (n -1) th position, więc jeśli użyjemy range (X) tutaj, wynik będzie równy 0, dlatego +1 powinno być użyte do wydrukowania listy w porządku rosnącym leksykograficznie.

+0

Proszę dodać objaśnienie wokół swojej odpowiedzi. – LordWilmore

+0

jako funkcja zasięgu nie zawiera wartości końcowej i zatrzymała się na (n-1) th pozycji, więc jeśli użyjemy tu zakresu (X), wynik będzie równy 0, dlatego +1 powinien być użyty do wydrukowania listy w kolejności rosnącej leksykograficznej. @LordWilmore – ravishing