Eric Brunson wrote: > Ricardo Aráoz wrote: >> Kent Johnson wrote: >> >>> I am building a list like this: >>> >>> tree = [] >>> for top in tops: >>> l2 = level2(top) >>> if l2: >>> tree.append((top, l2)) >>> >>> I would really like to turn this into a list comprehension: >>> >>> tree = [ (top, level2(top)) for top in tops if level2(top) ] >>> >>> but the call to level2() is expensive enough that I don't want to repeat >>> it. Is there any way to do this or am I stuck with the (IMO ugly) loop form? >>> >>> >> Just playing around here, but would this work and be better???? >> >> tree = [ pair for pair in [ (top, level2(top)) for top in tops ] >> if pair[1] ] >> >> > > I came up with something very similar: > > tops = [1,2,3,4,5] > > def level2(n): > m = n ** 2 > if m%2: > return m > else: > return False > > tree = [ (x, y) for x, y in [ ( x, level2(x) ) for x in tops ] if y ] > print tree > [(1, 1), (3, 9), (5, 25)] > > > But, now I would debate conciseness vs. readability and > maintainability. Will someone understand what's going on if they have > to read it? Will you remember what it does in six months when you're > maintaining it? > > Still, an interesting academic exercise. :-) > > e. >
It is perfectly understandable. Maybe the reason for doing it will not be clear, you can always put a comment explaining you don't want to call level2() twice. _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor