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