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