# [Tutor] Luke, thanks a lot , here is the perfect code (as per ur suggestion)

Kent Johnson kent37 at tds.net
Thu Oct 5 17:25:46 CEST 2006

```Asrarahmed Kadri wrote:
> #Implementation of Pascal Triangle
>
> num_of_lines = input("How many lines you want to display")
>
> list1 = []
>
> for i in range(num_of_lines):
>     flag = 0
>     tmp = []
>     for j in range(i+1):
>         if flag == 0 or j == i:
>             tmp.append(1)    # for the first or teh last element of the line
>             flag = 1
>         else:
>             tmp.append(list1[i-1][j-1]+list1[i-1][j])   # for rest, add
> teh numbers in previous  row
>
>     list1.append(tmp)

That's good. You could shorten it a little by getting rid of flag and
just testing for j==0 or j==i. Here is another way to do it, it requires
priming the output with the first row but the loop is a little shorter:

In [1]: binom = [[1]]

In [3]: for i in range(5):
...:     prev = binom[i]
...:     next = [1] + [ prev[j]+prev[j+1] for j in
range(len(prev)-1) ] + [1]
...:     binom.append(next)
...:
...:

In [4]: binom
Out[4]: [[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5,
10, 10, 5, 1]]

There's a truly hideous one-liner hidden in your solution. It uses
nested list comprehensions, a hack to refer to the list being built
within a list comp, and the new conditional expression. Be careful who
you show this too, it may scare dogs and small children ;) It does
actually work:

list1 = [ [ locals()["_[1]"][i-1][j-1]+locals()["_[1]"][i-1][j] if (j !=
0 and j != i) else 1 for j in range(i+1) ] for i in range(num_of_lines) ]

Now we know why conditional expressions were added to Python 2.5! See
this recipe for details about the locals() hack:
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/204297

Sorry I couldn't resist :-)
Kent

```