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 [email protected]
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/
-~----------~----~----~----~------~----~------~--~---