After posting the suggestion about splitting a string that contained a quoted string, I looked back at my (at least I think it’s mine) flatten routine and didn’t see anything like it at ASPN. Before I would post it there, does anyone see any problems with this non-recursive approach?

I know that there are iterator approaches, but since the list already exists is there any problem with flattening the whole thing? Or is part of the problem that there may be iterable things that don’t need to be completely “iterated to completion” before being able to yield the next element? (Does that make sense?)

After searching for "Tim Peters flatten" I was able to find a similar routine at

http://sourceforge.net/project/ showfiles.php?group_id=87034&package_id=90541&release_id=288585

(It is in the basictypes folder in the latebind.py script by Mike C. Fletcher.) It's so short, I post it for comparison. I'm not really sure why there is a run through all possible indices rather than the ones that exist in the given "inlist", though.

### Fletcher's
import sys
def flatten(inlist, type=type, ltype=(list,tuple), maxint= sys.maxint):
"""Flatten out a list, code developed by myself and modified by Tim Peters, then by me again :)"""
try:
# for every possible index
for ind in xrange( maxint):
# while that index currently holds a list
while isinstance( inlist[ind], ltype):
# expand that list into the index (and subsequent indicies)
inlist[ind:ind+1] = list(inlist[ind])
#ind = ind+1
except IndexError:
pass
return inlist
###



### mine
def flatten(l):
’’’Flattens a list in place.’’’
i=0
while i<len(l):
while hasattr(l[i],“__iter__”): #used by some ASPN flatteners to avoid strings
l[i:i]=l.pop(i)
i+=1


###

input: [1, 2, [3, 4, 5, [[6, 7], 8]], ’abc’, 9, [10, 11]]
output:[1, 2, 3, 4, 5, 6, 7, 8, ’abc’, 9, 10, 11]

/c


_______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor

Reply via email to