What does the following code do and how does it work?
>>> nmax = 5
>>> x = [1]
>>> for n in range(1,nmax+2):
... print(x)
... x = [([0]+x)[i] + (x+[0])[i] for i in range(n+1)]
...
The code snippet outputs the first nmax+1
rows of Pascal's Triangle:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
In the list comprehension assignment,
x = [([0]+x)[i] + (x+[0])[i] for i in range(n+1)]
the elements of two lists are added. The two lists are formed from the array representing the previous row by, in the first case adding a 0
to the beginning of the list, and in the second case by adding a 0
to the end of the list. In this way, the sum is taken over neighbouring pairs of numbers, with the end numbers unchanged. For example, if x
is [1, 3, 3, 1]
, the next row is formed by summing the elements in the lists
[0, 1, 3, 3, 1]
[1, 3, 3, 1, 0]
which yields the required [1, 4, 6, 4, 1]
.