Itertools
Heiko Wundram
heikowu at ceosg.de
Tue Jul 29 15:51:06 EDT 2003
Untested code that does basically this, but beware of any traps (read
and understand the code before trying to use it!!!), uses Python 2.3
functionality, but could be amended:
--- START OF CODE ---
import copy
class IDup(object):
def __init__(self,iterin):
self.__iter = iterin
self.__iterno = 0
self.__iteritems = []
self.__hasstopped = None
def registerIter():
iterno = self.__iterno
self.__iterno += 1
self.__iteritems.append([])
def getNext(self,iterno):
if self.__iteritems[iterno]:
iteritem = self.__iteritems[iterno].pop(0)
elif self.__hasstopped is not None:
raise self.__hasstopped
else:
try:
iteritem = self.__iter.next()
except StopIteration, e:
self.__hasstopped = e
raise
for id, i in enumerate(self.__iteritems):
if id <> iterno:
i.append(copy.deepcopy(iteritem))
return iteritem
class IDupped(object):
def __init__(self,idup):
self.__idup = idup
self.__iterno = idup.registerIter()
def next(self):
return self.__idup.getNext(self.__iterno)
def isplit(iterin,splitno=2):
idup = IDup(iterin)
iduppeds = []
for i in range(splitno):
iduppeds.append(IDupped(idup))
return tuple(iduppeds)
test = ["hello","how","are","you?"]
x, y = isplit(iter(test))
for i in x:
print i
for i in y:
print i
--- END OF CODE ---
Pitfalls:
1) You may not use the original iterator after it has been split.
2) Your iterator must return values which are copyable. If you wish for
the values to be truly equal (even in ID) or they are not copyable, then
just remove the copy.deepcopy from the code.
HTH!
Heiko.
More information about the Python-list
mailing list