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