[Tutor] Recursively flatten the list

Rafael Durán Castañeda rafadurancastaneda at gmail.com
Thu Mar 24 10:44:12 CET 2011


I can do it with two list comprehensions:

>>> list_ = [1, 2, [3, 4], 5, [6, 7, 8], 9]
>>> [x[i] for x in list_ if isinstance(x, list) for i in range(len(x))] + [x
for x in list_ if not isinstance(x, list)]
[3, 4, 6, 7, 8, 1, 2, 5, 9]
>>>

But i loose original order, Can anyone do it with just one list
comprehension and/or keeping the order?

I also tryied:

>>> [x if not isinstance(x, list) else (x[i] for i in range(len(x))) for x
in list_]
[1, 2, <generator object <genexpr> at 0x187f7d0>, 5, <generator object
<genexpr> at 0x187f870>, 9]
>>> [x if not isinstance(x, list) else [x[i] for i in range(len(x))] for x
in list_]
[1, 2, [3, 4], 5, [6, 7, 8], 9]
>>>

2011/3/24 Tom Zych <freethinker at pobox.com>

> Dharmit Shah wrote:
> > I am learning Python and yesterday I cam across a definition wherein I
> was
> > supposed to flatten a list recursively. I am getting the solution
> properly
> > but wanted to know if I can optimize the code further.
> >
> > #!/usr/bin/env python
> > new_list=[]
> > def flatten(num_list):
> >     """
> >       >>> flatten([2, 9, [2, 1, 13, 2], 8, [2, 6]])
> >       [2, 9, 2, 1, 13, 2, 8, 2, 6]
> >       >>> flatten([[9, [7, 1, 13, 2], 8], [7, 6]])
> >       [9, 7, 1, 13, 2, 8, 7, 6]
> >       >>> flatten([[9, [7, 1, 13, 2], 8], [2, 6]])
> >       [9, 7, 1, 13, 2, 8, 2, 6]
> >       >>> flatten([[5, [5, [1, 5], 5], 5], [5, 6]])
> >       [5, 5, 1, 5, 5, 5, 5, 6]
> >     """
> >     global new_list
> >     for i in num_list:
> >         if type(i) == type([]):
> >             new_list = flatten(i)
> >         else:
> >             new_list.append(i)
> >     tmp = new_list
> >     new_list=[]
> >     return tmp
> >
> > if __name__=="__main__":
> >     import doctest
> >     doctest.testmod()
> >
> > PS - My knowledge of Python is still very basic and I am trying to dive
> into
> > it as deeper as I can. Solutions on Stackoverflow.com were beyond my
> > understandability.
>
> Using doctest and getting a recursive function right don't strike me as
> basic.  This is pretty good for a beginner.
>
> I'll second Peter Otten regarding the use of a global.  It's best to
> avoid using globals whenever possible, not just for reentrancy, but for
> more readable and maintainable code.  A function should be self-contained
> if possible.  There's no reason you can't use a local variable in this
> code (and you only need one, not two), and the resulting code would be
> more readable.
>
> Regarding this line:
>    if type(i) == type([]):
>
> This also works:
>    if type(i) == list:
>
> But this is better:
>    if isinstance(i, list):
>
> isinstance(obj, class) means "is obj an instance of class or a subtype
> of class", so it's more general.
>
> Does anyone see a way to do this with a list comprehension?  I don't.
> Would be a neat hack if it can be done.
>
> --
> Tom Zych / freethinker at pobox.com
> "Because if they didn't vote for a lizard," said Ford, "the wrong lizard
> might get in." -- DNA
>
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20110324/c4aa4caa/attachment-0001.html>


More information about the Tutor mailing list