Nice solution! I was inspired by your bottom-up one-liner to create a top-bottom one-liner:

def minimumTotal(self, triangle):
return min(reduce(lambda a, b: [c+min(d,e) for c,d,e in zip(b,['']+a,a+[''])], triangle, [0]))

This has the advantage of not having to duplicate the reversed triangle in memory in order to process it.

I used the Python2 hack that for any integer n:

'' > n

I'm not sure how to fix the one-liner for Python3 without making that 1 line extremely long. But anyway I would typically write it in the more traditional form, even if it's a bit longer :-). This is how I had originally written it:

def minimumTotal(self, triangle):
r = [0]
for row in triangle:
r = [row[i] + min (r[max(i-1,0)], r[min(i,len(r)-1)]) for i in range(len(row))]
return min(r)