> I have a list of numbers and I want to build another list with every > second element multiplied by -1. > > input = [1,2,3,4,5,6] > wanted = [1,-2,3,-4,5,-6] > > I can implement it like this: > > input = range(3,12) > wanted = [] > for (i,v) in enumerate(input): > if i%2 == 0: > wanted.append(v) > else: > wanted.append(-v)
>>> input = range(3,12) >>> [i%2==0 and v or -v for (i,v) in enumerate(input)] [3, -4, 5, -6, 7, -8, 9, -10, 11] > But is there any other better way to do this. I'm not sure densely packing it into a list comprehension is necessarily a *better* way, just a more compact way. To make more sense of it, you might create a helper function that does your comparison work: def inv_if(v, test): if test: return v else: return -v [inv_if(v, i%2==0) for (i,v) in enumerate(input)] Or you could even do something like def inv_alternating(t): i, v = t if i%2==0: return v else: return -v [inv_alternating(t) for t in enumerate(input)] Either compacts it for the actual call within a list comprehension, but it is cleaner to read what's going on. -tkc -- http://mail.python.org/mailman/listinfo/python-list