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/ -~----------~----~----~----~------~----~------~--~---