Python Forum

Full Version: Understanding list comprehension
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I’m taking Colt Steele’s Udemy course called “The Modern Python 3 Bootcamp”. I’m on Section 13 on List Comprehension.

The instructor uses this as an example:

name = 'Nebuchadnezzar'
print([char.upper() for char in name])
Here is the output:
['N', 'E', 'B', 'U', 'C', 'H', 'A', 'D', 'N', 'E', 'Z', 'Z', 'A', 'R']

In my pseudo code that I came up with, these two lines could be read as: "Give me the uppercase format of every character for every character inside the name variable (which is a string) containing: 'Nebuchadnezzar'."

Is that pseudo code correct?

I am now taking the above list comprehension explanation a step further by trying to do something the course instructor did not do, which is re-write the simple algorithm as a regular for loop. Here is my valiant attempt:

name = 'Nebuchadnezzar'
new_name = []
for char in name:
    new_name = char.upper()
    char + char  
print(new_name)

The output is just R. I was expecting: ['N', 'E', 'B', 'U', 'C', 'H', 'A', 'D', 'N', 'E', 'Z', 'Z', 'A', 'R']

I’m not sure why or what I am doing wrong. I tried adding the append method to line 5 but that threw a syntax error. Would someone here be able to rewrite the original list comprehension as a regular for loop?

Here are some of the resources I have already consulted:
By the way, more of my list-comprehension practice that I have done today can be found here in a Jupyter Notebook in my GitHub repo.
on line 4 you assign each char to variable new_name, one at a time. Instead you should use list.append() method
line 5 is redundant, no visual effect whatsoever - you just concatenate char twice and it's immediately lost as you don't do anything (e.g. assign it to a variable)
(Nov-15-2019, 02:43 PM)Drone4four Wrote: [ -> ]Is that pseudo code correct?
yes, that is correct description of what's going on in the list comprehension.
print the list constructed from upper_case char for each char in name
You want the append on line 4, not line 5: new_name.append(char.upper()). Then delete line 5, you don't need it.
Thank you @ichabod801 and @buran. This helps. I've got my for loop behaving as I expect now.

Here is something new that I have learned from this thread:

When you are using a for loop whose purpose is to create a list, then list comprehension can be used and should be used because it is more concise and simpler and so it is more pythonic. Generally speaking, when you are creating a list with a loop, you need to invoke the append method. However when using a list comprehension technique in one line, there is no need to explicitly use list_variable.append() because .append() is always implied. .append needs to be invoked only when using a for loop expressed in full on multiple lines.

Is that correct? Is there anything you people might want to add?
I would say that is not necessarily correct. People fall in love with list comprehensions, but they can get overly complicated. If I can't fit a list comprehension onto one line (without abbreviating all of my variable names to single letters), I make a for loop. That depends on how you define "one line," but I think it's a good rule of thumb.