Sort 257 Discussions, By:
Please Login in order to post a comment
x, y, z, n = int(input()), int(input()), int(input()), int(input())
print ([[a,b,c] for a in range(0,x+1) for b in range(0,y+1) for c in range(0,z+1) if a + b + c != n ])
Looks good, but to avoid those repetitive input calls you could do something like:
x, y, z, n = (int(input()) for _ in range(4))
Thanks for the input. Will use this from now! :D
Please explain for me why you use range(4)
did you got the output for the above one by using list comprehension?
Great tip! BTW is there any reason for using '_' as the dummy variable? What's wrong with using letter, for example 'i'?
_ is used to signify that even though something is being returned, we don't plan to use that variable any where.
gives the following error in above code in python 2.7.13 : at 0x7f60c947e910>
You need to put an additional  in addition to [a,b,c]. Because the output that you want is are lists within a list.
It's also an old Perl trick. If you just performed the input command without assigning the data to anything, it was still available in the $_ variable by default.
It just like a while loop (Ex: while(a<5)) . If we need to store in the seperte varible you can use like this x,y,z,a = (int(input()) for n in range(4). It will be stored seperatly
no (lol u w8ted 3yrs 4 answer ;D)
just a small suggestion ..the 4 in for loop will be n+1
N is the number to compare the sum of x, y, z. The loop should actually have 4, as mentioned, for the inputs : x,y,z & n.
in py2 can be w/o int()
x,y,z,n = [input() for i in range(4)]
print [[a,b,c] for a in range(x+1) for b in range(y+1) for c in range(z+1) if a+b+c != n]
WHAT IS THE 4 INDICATES HERE
range(4) indicates 0,1,2,3 i.e the numbers we have given are allocated to the x,y,z,n respectively
4 input() s
what is the reason for x+1 y+1 and many more
In simple words it signifies that the range is inclusive of max limit
range() is inclusive of the first number (which is 0, by default), but exclusive of the last one. So "for i in range(5): print i" will give you 0,1,2,3,4 (but not five). In this case, we want to also include the number given, hence the +1. The 0 for the first part range(0,5), is optional, since we are starting at the beginning.
in python iteration occurs one less than the give variable
Can you help me with this logic ? why we check for a+ b +c !=n
read the question carefully you can understand easily.in the question they have given values inside the nested list must not equal to n so we have given a+b+c!=n
Doesn't work on python3.5
int is not required for input()
Yes it is in Python 3
I'm using this one line, but my compiler reads "wrong answer". Am I missing something? What else do I need to write?
u didnt arrange the list in lexicographic order
Disregard, I figured it out.
can u send the solution
I am a newbie to python and its not clear to me. WHY 4? And how the variable iterate from 0 to 1.
range(4) means range(0,4) that is 0,1,2,3 which is because we ahve to read 4 inputs
Read list comprehensions for more. It is an easy way to build a list.
How is this syntax even valid. Just wondering.
what does for _ in range(4) do ? what's the significance of the underscore? @omalsa04
I think that _ is used as a dummy variable name. Since it's meaning isn't really significant the name can be something representing that.
Wow nice way to take inputs.
why range (4) ???
why do i need to add parentheses around
int(input()) for _ in range(4)
in order for this code to work?
But instead of range[0,x] you could do
print ([[a,b,c] for a in range(x+1) for b in range(y+1) for c in range(z+1) if a + b + c != n ])
Trade three +1's for a +1 and a -1 at the right place :P
x, y, z, n = (int(raw_input())+1 for _ in range(4))
print [[a,b,c] for a in range(x) for b in range(y) for c in range(z) if a+b+c!=n-1]
although this method is more simple, but it not easy to understand.
I liked this method compared to other's.
really like this solution. simple and easy to read
i have done the same thing by its not working ,says invalid syntax
Simple and efficient than mine !! Thanks
Hey, I have heard that int(raw_input()) is faster.
raw_input() was renamed to input() in python 3
Can you tell me how python carries out list comprehension internally? How come this generates lists in lexicographic increasing order (i.e z increases first, then y, then x)?
It is in lexographical order due to the nature of the loops.
Spaced out it looks somewhat like
for a in range(x+1):
for b in range(y+1):
for c in range(z+1):
if a + b + c != n:
print(stuff is here)
We start at [0,0,0].
Then c will increment to get to [0,0,1]
When c hits [0,0,z], we get [0,1,0] as the next in the loop. This pattern continues and gives us the lexographical ordering required of the output.
it's very helpfull to understanding that what is actualy asking
Thank you. This is the a verbose response, but clearly the most elegant to understand what's going on.
yup! i understand.
Thanks for your solution, now we understand how it's word.
Here is my soltion with your sussgestion:
empty_list = 
for a in range ( x+ 1):
for b in range ( y + 1):
for c in range ( z + 1):
if (a + b + c != n) :
This solution is good! Utilising list comprehension to a good extreme.
Not reqired to put input() for each variable .just call the input for _ in range(no of variables);
a , b = int (input()) for _ in range ( 2 ):
Thanks for sharing your elegant code.
I'm a newbie to Python, its great to see such beautiful code :)
I don't like these "direct print" solutions. In my opinion the problem stated to create a list then print it, not just print something in a list. In other words in your solutions the list itself doesn't exist, can not be used later, it just collected when printed out. What do you think?
OK, I found the answer! I can put list = instead of printoing out, then print the list. It wasn't clear for me three for loops output is collected in a list, so no need for any append tricks!
Nice answer. As an alternative, to avoid multiple for loops you can use product:
combinations = list(product(range(x+1), range(y+1), range(z+1)))
print([list(a) for a in combinations if sum(a) != n])
from itertools import product
how is this working?
it is not solution, as question was to form list comperhention. You just put out data to screen in right format, no list comperhetion created
Could someone explain to me what, exactly, this code does (like, statement-by-statement)(other than the input part I understand that I mostly mean the list comprehension)? I sort of have a basic understanding of how it works, but having some trouble wrapping my head around list comprehensions and how exactly the work. Mostly the "for a in range(0,x+1)" parts. What exactly does that do? Why is it (0,x+1)? Thanks in advance.
Just search for something like 'python range' and you will get pages like this.
just for curiosity, why you are using range(0,x+1) in the print function?
why do you need two square brackets? Can someone explain this to me?
hello.. I tried to do as u said. But it is showing syntax error.
print([list(each) for each in product(range(x+1),range(y+1),range(z+1)) if sum(each)!=n])
I'm new to python, but how come nobody seems to be using ":" after their for loops. You don't even use one for the if loops at the end.
When you were using for statement inside the print statement you didn't use a colon infront of the for statement????
why was that
exactly what I had, expect I left the 0 implicit. Is it good practice to make the range explicit?
For this program it is fine. But in real time data range may not be static.
no need for 0 in range
how is list comprehension workin here?
I have no idea what is the syntax error that the compiler is showing repeatedly on (a+b+c)!=n
Thank you very much bro.....
i am new to python...
initially i din't understand your code but i realized after converting it into normal form.
x, y, z, n = int(input()), int(input()), int(input()), int(input())
for i in range(0,x+1):
for j in range(0, y + 1):
for k in range(0, y + 1):
if i + j + k !=n:
Thanks for your solution!
This is not usable with python 3 , shows error..!!
i got it in google chrome but not in edge i dont know the issue
thank you for commenting
The problem states that it wants the output list printed in 'increasing order'. It should be more clear what this means. I initially interpreted this to mean that [1,1,0] would come before [3,0,0] because 1+1+0=2 is less than 3+0+0=3. But this is not the order that the comprehension list method would generate the list. And would likely involve some method of sorting a 3D array that many new users would not know at this point, so I'm assuming this is not what is meant. This problem is not clarified with the chosen example values of x=1, y=1, z=1, and N=2.
The problem could be addressed by just using larger example values, allowing us to infer from the example output which interpretation of 'increasing order' is intended.
What does N represent? Why should X+Y+Z not equal N? And what do the subscript i's represent? I don't understand the question.
@scintilla read the question properly. 0<=Xi<=X same for Yi and Zi.N is specified in the question.
I am sooooooooooooo confused with the question holy cow.
You can't just say "Read the question properly". He said he doesn't understand the syntax of the question.
This is a type of mathematic short-hand that not all of us understand. I for one don't even know what this short-hand is called or I'd look it up myself.
Try now, I have updated the statement :)
Thank you for the follow-up shashank21j, your revision to the statement has been helpful, but I still have some questions about the way the question is worded and why.
1.Why must i+j+k not be equal to N and does this mean it can be greater than N?
2.Please define "lexicographic increasing order"
I for one agree that list comprehension in python is a fairly simple subject, the crux of this problem for me however, is bridging the communication gap/understanding the essance of the problem you're asking.
Many people who use your site are self taught in coding and do not have a formal discrete mathematics background.
i + j + k != N is just an added condition in this problem so you can use 1 if statement inside your list compehension syntax. It can be greater than N as long as i, j and k are in their respective limits.
Thanks again shashank21j! :)
Shouldn't the statement include that X,Y,Z are integers that are possible maximums? It is a fairly important point no? For example dimensions of 2,2,2 given the statement as it currently is, means there is only 1 possible cube with 8 coordinates.
Where as if we said that 2 is the max integer value for X,Z,Y , we can have more than 1 possible cuboid. For example a 1,1,2 cuboid.
I have also difficulty understanding the question.
Can anybody make me understand this question ? I went through few comments what this question all about but still I'm not clear
You're given 4 numbers. The first 3 correspond to the maximum dimensions of a cube. y is the maximum height, x is the maximum width, and z is the maximum depth.
You're supposed to calulate every possible set of dimensions [x,y,z], under the condition that none exceed the input values, and that x+y+z does not add up to n.
thanks that was very helpful!
Thanks for the explanation eric. I've just one more question that in this lexicographic order the last dimension is [1,1,1], but our N is given to be 2. Thus the sum of x+y+z becomes 3 which is greater than N. How is this condition satisfied?? Pls explain.
The only restriction relating to N is that i + j + k != N. i+j+k>N is perfectly valid.
Thanks for your help. Was helpful and appreciate that
Helpful explanation! Thank you
I agree that what you say is the intention of the challenge, But my problem with this challenge is that it never states that X,Y,Z are maximums.
Sample input of 2,2,2 can only be 1 cube with 8 dimensions.
I feel like the statement should be change to express what you are saying, that X,Y,Z correspond to maximum integer dimensions.
print([[i,j,k] for i in range(x+1) for j in range(y+1) for k in range(z+1) if sum([i,j,k]) != n])
I feel like I am missing the point of this exercise with my solution. Can someone please comment on how to make my code more pythonesque and utilize list comprehensions better.
X = int(raw_input())
Y = int(raw_input())
Z = int(raw_input())
N = int(raw_input())
Xi = [x for x in range(X+1)]
Yi = [y for y in range(Y+1)]
Zi = [z for z in range(Z+1)]
results = 
for x in Xi:
for y in Yi:
for z in Zi:
if x + y + z != N:
this is fine.
Xi Yi and Zi are not much of use here. You can make your code smaller
cuboid = 
results = [cuboid.append([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]
Less lines, more Pythonic
That's really great :)
print ([[a,b,c] for a in range(int(input())+1) for b in range(int(input())+1) for c in range(int(input())+1) if a+b+c!=int(input())])
why does this code not work?
can you explain?
The inputs should be captured before the for loop is executed. In this case, a new input is expected for every iteration of the for loop. Try capturing the inputs first inside some variables and use those variables here. That will work.
You don't even need to have the cuboid list to be honest :)
print ([[a,b,c] for a in range(0,x+1) for b in range(0,y+1) for c in range(0,z+1) if a + b + c != n ])
ha!, I realized that a day later. Thanks for clearing it up though gkeswani92
bro can you please explain the code?
For begginers :
list_elem = 
for hor in range(x +1):
for vert in range(y + 1):
for diag in range(z + 1):
if (hor + vert + diag) != n:
elem = 
Here is Python 3 solution from my HackerrankPractice repository:
x, y, z, n = [int(input()) for _ in range(4)]
listOfAnswers = [[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]
Feel free to ask if you have any questions :)
I'm trying to teach myself Python, and reading this question honestly made me want to give it up. I had no idea what was being asked or how to go about it. If you have the time could you give me an idea of your step by step process for coming to this solution, as far as you can remember? I generally understand what you've done here, but I want to know how to come to a similar conclusion when I encounter a similar problem.
me too Ç_Ç
The problem was written very academically. I feel your pain. Weirdly enough they provide an example later on that is actually the answer....
Ive been finding myself working backwards when I 'figure' a hard problem. I usually don't know why the solution works, so I try to reverse engineer all the elements that work it.
[[l,j,k] for l in range(x+1) for j in range(y+1) for k in range(z+1) if ((j+l+k) != n)]
we create a placeholder list [l,j,k] that iterates over a range from zero to the provided integers. since range is not inclusive, we can find this range by saying range(x+1) since it will provide a list of 0...1...2. we then define how each placeholder int iterates by each subsequent range declaration. After we provide the context of the iteration, we provide an if statement that the sum of all three iterables can't equal n. How the heck the computer does that magic...I don't know.
Someone correct me but this is the best I understand the solution. Even if I'm very wrong, just explaining it helps me understand it.
Ok, after hours trying to actually understand the problem, and after trying to solve it in reverse, I hope to bring some clarity for those who are having a hard time trying to solve or to understand what exactly needs to be done and what the codes posted here are actually doing. I did this using Python 3.
Ignoring the mathematical terms, the problem wants you to create a list in a concise way (that's called 'List Comprehension'). Which consists on creating a list using 'for' and, possibly, 'if' (in case you want an extra condition in that list).
In this case, it asks you to create multiple lists using 3 'for' clauses: i, j and k. In each theses clauses you will choose an range to vary from 0, which will be called x (for clause i), y (for clause j) and z (for clause k).
The challenge here is to create every possible list that will show all values from the chosen ranges (x, y and z) in a way that the the predecessor number will change to the next value from the range only AFTER the successor number shows all it's values first.
Before trying an example, first a reminder:
As seen in previous challenges, in a 'for' clause, the value of a range will vary (as a standard) from 0 to the predecessor number in that range. I.E.: for A in range(2): will output 0 and 1, but not 2.
Now, let's try to solve it with a simple example: I'll set both, x, y and z to 1, just to make it easier.
This is the formula in a clearer way (not in a single line, but I believe it's best for beginners to understand):
listijk =  #an empty list to be filled as following
for i in range(x + 1): #it will output 0, and will only output 1 after the next conditions ('for j' and 'for k') are met.
for j in range (y + 1): #it will output 0, and will only output 1 after the next condition ('for k') is met.
for k in range (z + 1): #it will output 0 and then 1.
listijk.append([i,j,k]) #it will add i, j and k values to the list
print(listijk) #print the list properly filled
(copy and paste the code in an code editor for clearer reading)
In the example above, that's what will happen behind the scenes, in this exact order:
i = 0, j = 0, k = 0
i = 0, j = 0, k = 1
i = 0, j = 1, k = 0
i = 0, j = 1, k = 1
i = 1, j = 0, k = 0
i = 1, j = 0, k = 1
i = 1, j = 1, k = 0
i = 1, j = 1, k = 1
It will print exactly like that:
[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]
As you can see, it made 8 different output variations.
Now, to the last part of the problem...
It creates one extra condition: it will NOT print the outputs which the sum of the values inherited by i, j and k equals to the integer 'n'.
So, this time, the code will become:
listijk = 
for i in range(x + 1):
for j in range (y + 1):
for k in range (z + 1):
if i + j + k != n: #before printing the result, it will exclude the output which 'i' + 'j' + 'k' is the same as 'n'.
In this case, let's suppose that 'n' is set to 2:
i = 0, j = 0, k = 0 #will print
i = 0, j = 0, k = 1 #will print
i = 0, j = 1, k = 0 #will print
i = 0, j = 1, k = 1 #will NOT print (1 + 1 = 2)
i = 1, j = 0, k = 0 #will print
i = 1, j = 0, k = 1 #will NOT print (1 + 1 = 2)
i = 1, j = 1, k = 0 #will NOT print (1 + 1 = 2)
i = 1, j = 1, k = 1 #will print
And then, it will print the following 5 outputs:
[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 1]
That's an extense explanation, but I'm just trying to make it as clear as possible for those who, just like me, are having a hard time figuring out what the problem wants and what the codes posted here and in the examples are really doing. Hope it helps someone.
Can any one please tell me what is wrong with my code.
if name == 'main':
x = int(input())
y = int(input())
z = int(input())
n = int(input())
print([[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 + z != n])
Why cant i get the same answer if I use i,j,k instead of a,b,c
I face the same problem. Any idea?
It worked for in python 2 here is my code, hope it will help
if name == 'main':
x = int(raw_input())
y = int(raw_input())
z = int(raw_input())
n = int(raw_input())
print [[a,b,c]for a in range(x + 1) for b in range (y + 1) for c in range(z + 1) if((a+b+c)!=n)]
2 errors -
Oh..How could i miss that!!!!
Thank You so much :)