Emile van Sebille <em...@fenx.com> writes: > On 5/1/2009 7:31 AM J Kenneth King said... >> Chris Rebert <c...@rebertia.com> writes: >>> b = [] >>> for pair in a: >>> for item in pair: >>> b.append(item) >> >> This is much more clear than a nested comprehension. >> >> I love comprehensions, but abusing them can lead to really dense and >> difficult to read code. > > I disagree on dense and difficult, although I'll leave open the > question of abuse.
Dense and difficult may be subjective to people like you or I, but you left out the "to read" part of that sentence. I was referring to the negative effect nested or complex list comprehensions can have on readability. > b = [ item for pair in a for item in pair ] It's a clever statement, but use it once and its gone. Why not use the expanded form in a function definition and get an even shorter, but clearer statement? >>> b = flatten(a) Boom, done. > This is exactly the code above expressed in comprehension form. > > It's worth knowing that a list comprehension is structured identically > to the equivalent for loop. So it really is neither more dense nor > more difficult to read. Further, you can tell immediately from the > start of the list comprehension what you've got -- in this case a list > of item(s). > > Here with some slight changes... > >>>> a = [(1, 2), (3, 4, 7), (5, 6)] >>>> [ item for j in a if len(j)==2 for item in j if item % 2 ] > [1, 5] > > ...opposed to... > >>>> for j in a: > ... if len(j)==2: > ... for item in j: > ... if item % 2: > ... b.append(item) > ... >>>> b > [1, 5] >>>> Thanks for the lesson in list comprehensions, but I'm well aware of how they work. List comprehensions can make a reader of your code apprehensive because it can read like a run-on sentence and thus be difficult to parse. The Python documentation discourages their use and I believe for good reason. It's much easier to explain complex processes with a function rather than a single nested statement. > > YMMV, > > Emile It will apparently vary greatly. Depending on how much coffee I've had. ;) J -- http://mail.python.org/mailman/listinfo/python-list