[kupfer] datatools: Add UniqueIterator, iterate with set uniqueness semantics



commit bd172f4efbd80364dc7d3e1f5c307074b1a547fc
Author: Ulrik Sverdrup <ulrik sverdrup gmail com>
Date:   Mon Jan 4 15:29:02 2010 +0100

    datatools: Add UniqueIterator, iterate with set uniqueness semantics

 kupfer/datatools.py |   23 +++++++++++++++++++++++
 1 files changed, 23 insertions(+), 0 deletions(-)
---
diff --git a/kupfer/datatools.py b/kupfer/datatools.py
index 845d299..c5ae3e8 100644
--- a/kupfer/datatools.py
+++ b/kupfer/datatools.py
@@ -70,6 +70,29 @@ class SavedIterable (object):
 		# (callable, args, state, listitems)
 		return (list, (), None, iter(self))
 
+def UniqueIterator(seq, key=None):
+	"""
+	yield items of @seq with set semantics; no duplicates
+
+	>>> list(UniqueIterator([1, 2, 3, 3, 5, 1]))
+	[1, 2, 3, 5]
+	>>> list(UniqueIterator([1, -2, 3, -3, -5, 2], key=abs))
+	[1, -2, 3, -5]
+	"""
+	coll = set()
+	if key is None:
+		for obj in seq:
+			if obj not in coll:
+				yield obj
+				coll.add(obj)
+		return
+	else:
+		for obj in seq:
+			K = key(obj)
+			if K not in coll:
+				yield obj
+				coll.add(K)
+
 if __name__ == '__main__':
 	import doctest
 	doctest.testmod()



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]