Python Forum
Example of list comprehensions doesn't work
Thread Rating:
  • 2 Vote(s) - 1.5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Example of list comprehensions doesn't work
#11
You get a
Error:
UnboundLocalError: local variable 'z' referenced before assignment
The cause is, you're referencing z before it has been assigned.
In this case it doesn't matter, that the name z is global.
In the context of the list comprehension the name z is a local variable, because it's assigned.
You may ask now, where the assignment happens:

for z in range(z+1)

The red one, is the assignment of local variable z. The green is read access to the variable.
Just change the z into z_ and the code works.

print([[x,y,z_] for i in range(x+1) for j in range(y+1) for z_ in range(z+1)])
Almost dead, but too lazy to die: https://sourceserver.info
All humans together. We don't need politicians!
Reply
#12
@micseydel
At first I used nested loops but I read somewhere that that using nested loops in Python is considered a garbage code

@DeaD_EyE
Thank you, I completely missed that.
print([[x,y,z] for i in range(x+1) for j in range(y+1) for k in range(z+1)  if i+j+k != n])
works fine.

p.s. checking again it doesn't work as I expected.
The result is:
Output:
[[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]
the input was: 1 1 1 2
Reply
#13
(May-14-2018, 08:52 PM)Truman Wrote: At first I used nested loops but I read somewhere that that using nested loops in Python is considered a garbage code
That doesn't make any sense to me. I'm a professional software engineer and if I saw that complicated of a comprehension during code review, I'd have them break it up. I had a Google interviewer suggest I not use a comprehension for something that would have been less complicated than that.

Comprehensions are an intermediate feature so there's some prestige associated with them I suppose, but you should use the right tool for the right job, and code at your level - as I said I don't think you'd have this problem with a plain old nested loop, so I suggest you stick to simpler concepts until you have more mastery. Even if you prefer to keep using comprehensions, I'd suggest in situations like this where you're struggling to debug the comprehension, break it up anyway. If you need to break it up to debug it, it probably should be broken up, but personally even if I want it to ultimately be a comprehension I'll simplify the code for debugging.
Reply
#14
Thank you.

I would appreciate anyone's opinion on why my previous line of code doesn't work. It doesn't look complicated but still it doesn't give me the output that I want. Comprehension with x and y works fine, but the one with x,y and z doesn't although it's the same logic.
Reply
#15
What you are doing is to sacrifice the readability of the code for some desire to be pythonic. Pythonic means just that, the right tool in the right place. As @micseydel mentioned it already.
One reason why Python has this popularity is that it's easy to read. And to write. You are struggling to write one piece of code. It should not be that way. If it's hard for you to write it, it will be hard for someone else to read it.
"As they say in Mexico 'dosvidaniya'. That makes two vidaniyas."
https://freedns.afraid.org
Reply
#16
(May-14-2018, 08:52 PM)Truman Wrote:
print([[x,y,z] for i in range(x+1) for j in range(y+1) for k in range(z+1) if i+j+k != n])
(May-17-2018, 07:56 PM)Truman Wrote: I would appreciate anyone's opinion on why my previous line of code doesn't work. It doesn't look complicated but still it doesn't give me the output that I want.
well, that's the correct output.
Probably you were thinking of writing
print([[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])
If you can't explain it to a six year old, you don't understand it yourself, Albert Einstein
How to Ask Questions The Smart Way: link and another link
Create MCV example
Debug small programs

Reply
#17
(May-18-2018, 08:17 AM)buran Wrote:
print([[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])

Being an extremely lazy person Tongue, I would have written that as
[coords for coords in itertools.product(range(x+1), range(y+1), range(z+1)) 
 if sum(coords) != n]
I know that it is actually longer - but I really hate one-letter variables Naughty (x, y and z I can forgive Cool )
Test everything in a Python shell (iPython, Azure Notebook, etc.)
  • Someone gave you an advice you liked? Test it - maybe the advice was actually bad.
  • Someone gave you an advice you think is bad? Test it before arguing - maybe it was good.
  • You posted a claim that something you did not test works? Be prepared to eat your hat.
Reply
#18
I fully agree regarding one-letter variable names :-)
If you can't explain it to a six year old, you don't understand it yourself, Albert Einstein
How to Ask Questions The Smart Way: link and another link
Create MCV example
Debug small programs

Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Why doesn't list require global keyword? johnywhy 9 796 Jan-15-2024, 11:47 PM
Last Post: sgrey
  Why doesn't calling a parent constructor work with arbitrary keyword arguments? PurposefulCoder 4 930 Jun-24-2023, 02:14 PM
Last Post: deanhystad
  Why do I have to repeat items in list slices in order to make this work? Pythonica 7 1,321 May-22-2023, 10:39 PM
Last Post: ICanIBB
  Beginner: Code not work when longer list raiviscoding 2 817 May-19-2023, 11:19 AM
Last Post: deanhystad
  Why doesn't this code work? What is wrong with path? Melcu54 7 1,780 Jan-29-2023, 06:24 PM
Last Post: Melcu54
  How to work with list kafka_trial 8 2,004 Jan-24-2023, 01:30 PM
Last Post: jefsummers
  color code doesn't work harryvl 1 885 Dec-29-2022, 08:59 PM
Last Post: deanhystad
  convert this List Comprehensions to loop jacklee26 8 1,503 Oct-21-2022, 04:25 PM
Last Post: deanhystad
  client.get_all_tickers() Doesn't work gerald 2 1,705 Jun-16-2022, 07:59 AM
Last Post: gerald
  Are list/dict comprehensions interpreted really sequentially? anata2047 3 1,451 May-31-2022, 08:43 PM
Last Post: Gribouillis

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020