summaryrefslogtreecommitdiff
path: root/itertoolset.py
diff options
context:
space:
mode:
Diffstat (limited to 'itertoolset.py')
-rw-r--r--itertoolset.py30
1 files changed, 30 insertions, 0 deletions
diff --git a/itertoolset.py b/itertoolset.py
new file mode 100644
index 0000000..ae4be8a
--- /dev/null
+++ b/itertoolset.py
@@ -0,0 +1,30 @@
+from itertools import *
+
+def roundrobin(*iterables):
+ """roundrobin('ABC', 'D', 'EF') --> A D E B F C"""
+ pending = len(iterables)
+ nexts = cycle(iter(it).next for it in iterables)
+ while pending:
+ try:
+ for next in nexts:
+ yield next()
+ except StopIteration:
+ pending -= 1
+ nexts = cycle(islice(nexts, pending))
+
+def unique_everseen(iterable, key=None):
+ "List unique elements, preserving order. Remember all elements ever seen."
+ # unique_everseen('AAAABBBCCDAABBB') --> A B C D
+ # unique_everseen('ABBCcAD', str.lower) --> A B C D
+ seen = set()
+ seen_add = seen.add
+ if key is None:
+ for element in ifilterfalse(seen.__contains__, iterable):
+ seen_add(element)
+ yield element
+ else:
+ for element in iterable:
+ k = key(element)
+ if k not in seen:
+ seen_add(k)
+ yield element