I was doing some exercises on list comprehensions and the usage of * . I think I know that it's going on, but I find it very difficult to put into concrete words. How would you explain b?
I'm not sure how to understand either what the empty string does or what the (7-i) causes in b.
a = [1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1]
b = [' ' * 2 * (7 - i) 'very' * i for i in a]
for line in b:
print(line)
Thank you very much!
CodePudding user response:
You can replace the list comprehension with a for-loop:
b=[]
for i in a:
nextline = ' ' * 2 * (7 - i) 'very' * i
b.append(nextline)
What the comprehension is doing is essentially adding whitespace to the beginning, depending on i.
You can replace this: ' ' * 2 with this: ' ' (two spaces) and still get the same result.
Essentially the (7-i) is displaying a certain number of whitespace characters for whatever i actually is.
CodePudding user response:
Let's split the statement up into its separate parts:
b = [' ' * 2 * (7 - i) 'very' * i for i in a]
The looping part is the last part:
for i in a
This only says that we should loop over the values of a, and do the rest of the statement for each entry.
' ' * 2 * (7 - i) 'very' * i
This is the actual statement being executed for each value in a. In both cases this is a string being multiplied -- which means it's being repeated the number of times it gets multiplied:
' ' * 2 * (7 - i)
This repeats a single space 2 * (7 - i) times; which means that it adds between 0 (2 * (7 - 7)) and 12 (2 * (7 - 1)) spaces in front of the string. The reason why they multiply by 2 is because the string very is four characters, so to center it you'll need length / 2 spaces in front of it.
'very' * i
This means very gets repeated i times, which will be 1, 2, 3, etc. times.
The merges the two strings, so that you get [0, 12] spaces, then very repeated n times.
When i is 1:
' ' * 2 * (7 - 1)=> 12 spacesvery * 1=>very
very
If i is 2, the number of spaces decrease by 2 (7 - 2 is now 5), while very gets repeated one additional time (veryvery):
veryvery
CodePudding user response:
Your list comprehension takes every element i (in this case, they are all integers) from list a and then stores the value of ' ' * 2 * (7 - i) 'very' * i as an element in the new list b.
When multiplying a string with an integer i, the string is repeated i times. So in your case, ' ' * 2 * (7 - i) means that a space (not an empty string!) is repeated 2 * (7 - i) times. For instance, for the second element i = 2, this means 2 * (7 - 2) = 10 spaces.
So the second part is 'very' * i and works the same way. For example, the second element i = 2, the string 'very' is repeated twice.
When adding two strings, they are concatenated. So your second element now has 10 spaces and twice the word 'very' --> ' veryvery'.
Do the same for every other number in a and you got
b = [
' very',
' veryvery',
' veryveryvery',
' veryveryveryvery',
' veryveryveryveryvery',
' veryveryveryveryveryvery',
'veryveryveryveryveryveryvery',
' veryveryveryveryveryvery',
' veryveryveryveryvery',
' veryveryveryvery',
' veryveryvery',
' veryvery',
' very']
CodePudding user response:
So basically here is what is going on step by step:
b = [' ' * 2 * (7 - i) 'very' * i for i in a]
i is changing values from while going through a : so it has the value 1, then 2 and so on
For the case for example where i has the value 1, the following string is constructed :
two white spaces " " " " 7-1 times (so basically 12 white spaces
then we concatenate very 1 time (i times)
