On Wed, 01 Dec 2010 15:18:32 -0800, Dmitry Groshev wrote: > Here is a fresh example of what I meant by my first proposal. You need > to build a matrix like this: > 2 1 0 ... > 1 2 1 ... > 0 1 2 ... > ... > ... 1 2 1 > ... 0 1 2 > You could do this by one-liner: > [[(2 - abs(x - y)) if it > 0 else 0 for x in xrange(8)] for y in > xrange(8)] > ...but in reality you should write something like this: [[(lambda t: t > if t > 0 else 0)(2 - abs(x - y)) for x in xrange(8)] for y in xrange(8)] > or this > [[(2 - abs(x - y)) if (2 - abs(x - y)) > 0 else 0 for x in xrange(8)] > for y in xrange(8)] > or even this > def foo(x, y): > if abs(x - y) == 0: > return 2 > elif abs(x - y) == 1: > return 1 > else: > return 0 > [[foo(x, y) for x in xrange(8)] for y in xrange(8)]
All those one-liners give me a headache. At least your "foo" solution is understandable. But I'd do it like this: >>> array = [[0]*8 for _ in range(8)] >>> for i in range(8): ... array[i][i] = 2 ... if i > 0: array[i][i-1] = 1 ... if i < 7: array[i][i+1] = 1 ... >>> pprint.pprint(array) [[2, 1, 0, 0, 0, 0, 0, 0], [1, 2, 1, 0, 0, 0, 0, 0], [0, 1, 2, 1, 0, 0, 0, 0], [0, 0, 1, 2, 1, 0, 0, 0], [0, 0, 0, 1, 2, 1, 0, 0], [0, 0, 0, 0, 1, 2, 1, 0], [0, 0, 0, 0, 0, 1, 2, 1], [0, 0, 0, 0, 0, 0, 1, 2]] When you stop trying to make everything a one-liner, it's amazing how readable you can make code :) -- Steven -- http://mail.python.org/mailman/listinfo/python-list