On 6/28/07, Hamptonio <[EMAIL PROTECTED]> wrote:
> Whoops! - sorry about the misreporting on the GF(5) behavior.  I was
> playing around with lots of similar versions and I must have gotten
> confused.
>
> That extra loop you deleted was put in to avoid errors on weird cases
> like: flatten([[]]), which gives an "IndexError: list index out of

Thanks.  I've amended the patch with this improvement, and
included some docstrings.

 -- William

> range" if the extra loop is removed.   But it was badly done.  Here is
> another attempt which I think behaves OK on nested empty lists and
> things that evaluate to False:
>
> def flatten(in_list, ltypes=(list, tuple)):
>     """
>     Flattens a nested list.
>
>     INPUT:
>         in_list -- a list or tuple
>         ltypes -- optional list of particular types to flatten
>
>     OUTPUT:
>         a flat list of the entries of in_list
>
>     EXAMPLES:
>         sage: flatten([[1,1],[1],2])
>         [1, 1, 1, 2]
>         sage: flatten([[1,2,3], (4,5), [[[1],[2]]]])
>         [1, 2, 3, 4, 5, 1, 2]
>
>     In the following example, the vector isn't flattened because
>     it is not given in the ltypes input.
>         sage: flatten((['Hi',2,vector(QQ,[1,2,3])],(4,5,6)))
>         ['Hi', 2, (1, 2, 3), 4, 5, 6]
>
>     We give the vector type and then even the vector gets flattened:
>         sage: flatten((['Hi',2,vector(QQ,[1,2,3])], (4,5,6)),
> ltypes=(list,
> tuple,sage.modules.vector_rational_dense.Vector_rational_dense))
>         ['Hi', 2, 1, 2, 3, 4, 5, 6]
>
>     We flatten a finite field.
>         sage: flatten(GF(5))
>         [0, 1, 2, 3, 4]
>         sage: flatten([GF(5)])
>         [Finite Field of size 5]
>         sage: flatten([GF(5)], ltypes = (list, tuple,
> sage.rings.finite_field.FiniteField_prime_modn))
>         [0, 1, 2, 3, 4]
>
>     """
>     index = 0
>     new_list = [x for x in in_list]
>     while index < len(new_list):
>         while isinstance(new_list[index], ltypes):
>             if len(new_list[index]) != 0:
>                 new_list[index : index + 1] = list(new_list[index])
>             else:
>                 new_list.pop(index)
>                 break
>         index += 1
>     return new_list
>
>
> On Jun 28, 7:40 pm, "William Stein" <[EMAIL PROTECTED]> wrote:
> > On 6/28/07, Hamptonio <[EMAIL PROTECTED]> wrote:
> >
> > > Interesting.  I think I originally ripped mine off from one of [...]
> >
> > Hi,
> >
> > I've incorporated this into SAGE as a patch.  The main things I did
> > were add more examples and delete part of the function which I
> > consider stupid.  E.g., you wrote "flatten(GF(5)) does return [0,1,2,3,4]"
> > but in fact it doesn't -- it returns [1,2,3,4] -- since it removes all 
> > things
> > that evaluate to False because of this code:
> >
> >        if not new_list[index]:
> >            new_list.pop(index)
> >            continue
> >
> > So I deleted that code, since I see no reason for it, and all the examples
> > work fine without it.
> >
> > Comments?
> >
> > William
> >
> > [EMAIL PROTECTED]:~/d/sage/sage/misc$ hg export 5194
> > # HG changeset patch
> > # User William Stein <[EMAIL PROTECTED]>
> > # Date 1183076918 25200
> > # Node ID 25f23d18288895f46a6aaa2bd8ef147cde5e31f3
> > # Parent  65b460226d8173061face0c810fa6cffaf20dc08
> > Marshall Hampton's flatten command (suitably modified)
> >
> > diff -r 65b460226d81 -r 25f23d182888 sage/misc/all.py
> > --- a/sage/misc/all.py  Thu Jun 28 16:17:05 2007 -0700
> > +++ b/sage/misc/all.py  Thu Jun 28 17:28:38 2007 -0700
> > @@ -6,6 +6,8 @@ from misc import (alarm, srange, xsrange
> >                    repr_lincomb, tmp_dir, tmp_filename,
> >                    DOT_SAGE, SAGE_ROOT, SAGE_URL, SAGE_DB, SAGE_TMP,
> >                    is_32_bit, is_64_bit, newton_method_sizes)
> > +
> > +from flatten import flatten
> >
> >  from remote_file import get_remote_file
> >
> > diff -r 65b460226d81 -r 25f23d182888 sage/misc/flatten.py
> > --- /dev/null   Thu Jan 01 00:00:00 1970 +0000
> > +++ b/sage/misc/flatten.py      Thu Jun 28 17:28:38 2007 -0700
> > @@ -0,0 +1,42 @@
> > +def flatten(in_list, ltypes=(list, tuple)):
> > +   """
> > +   Flattens a nested list.
> > +
> > +   INPUT:
> > +       in_list -- a list or tuple
> > +       ltypes -- optional list of particular types to flatten
> > +
> > +   OUTPUT:
> > +       a flat list of the entries of in_list
> > +
> > +   EXAMPLES:
> > +       sage: flatten([[1,1],[1],2])
> > +       [1, 1, 1, 2]
> > +       sage: flatten([[1,2,3], (4,5), [[[1],[2]]]])
> > +       [1, 2, 3, 4, 5, 1, 2]
> > +
> > +   In the following example, the vector isn't flattened because
> > +   it is not given in the ltypes input.
> > +       sage: flatten((['Hi',2,vector(QQ,[1,2,3])],(4,5,6)))
> > +       ['Hi', 2, (1, 2, 3), 4, 5, 6]
> > +
> > +   We give the vector type and then even the vector gets flattened:
> > +       sage: flatten((['Hi',2,vector(QQ,[1,2,3])], (4,5,6)),
> > ltypes=(list, 
> > tuple,sage.modules.vector_rational_dense.Vector_rational_dense))
> > +       ['Hi', 2, 1, 2, 3, 4, 5, 6]
> > +
> > +   We flatten a finite field.
> > +       sage: flatten(GF(5))
> > +       [0, 1, 2, 3, 4]
> > +       sage: flatten([GF(5)])
> > +       [Finite Field of size 5]
> > +       sage: flatten([GF(5)], ltypes = (list, tuple,
> > sage.rings.finite_field.FiniteField_prime_modn))
> > +       [0, 1, 2, 3, 4]
> > +
> > +   """
> > +   index = 0
> > +   new_list = [x for x in in_list]
> > +   while index < len(new_list):
> > +       while isinstance(new_list[index], ltypes):
> > +           new_list[index : index + 1] = list(new_list[index])
> > +       index += 1
> > +   return new_list
> >
> > William
> >
> >  *.txt
> > 1KDownload
>
>
> >
>


-- 
William Stein
Associate Professor of Mathematics
University of Washington
http://www.williamstein.org

--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to sage-devel@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/sage-devel
URLs: http://sage.scipy.org/sage/ and http://modular.math.washington.edu/sage/
-~----------~----~----~----~------~----~------~--~---

Reply via email to