Commit 6044655d authored by Raymond Hettinger's avatar Raymond Hettinger

Update itertools recipes.

parent 3522e040
...@@ -632,9 +632,6 @@ which incur interpreter overhead. ...@@ -632,9 +632,6 @@ which incur interpreter overhead.
"Return first n items of the iterable as a list" "Return first n items of the iterable as a list"
return list(islice(iterable, n)) return list(islice(iterable, n))
def enumerate(iterable, start=0):
return izip(count(start), iterable)
def tabulate(function, start=0): def tabulate(function, start=0):
"Return function(0), function(1), ..." "Return function(0), function(1), ..."
return imap(function, count(start)) return imap(function, count(start))
...@@ -741,10 +738,9 @@ which incur interpreter overhead. ...@@ -741,10 +738,9 @@ which incur interpreter overhead.
seen = set() seen = set()
seen_add = seen.add seen_add = seen.add
if key is None: if key is None:
for element in iterable: for element in ifilterfalse(seen.__contains__, iterable):
if element not in seen: seen_add(element)
seen_add(element) yield element
yield element
else: else:
for element in iterable: for element in iterable:
k = key(element) k = key(element)
...@@ -758,6 +754,30 @@ which incur interpreter overhead. ...@@ -758,6 +754,30 @@ which incur interpreter overhead.
# unique_justseen('ABBCcAD', str.lower) --> A B C A D # unique_justseen('ABBCcAD', str.lower) --> A B C A D
return imap(next, imap(itemgetter(1), groupby(iterable, key))) return imap(next, imap(itemgetter(1), groupby(iterable, key)))
def iter_except(func, exception, first=None):
""" Call a function repeatedly until an exception is raised.
Converts a call-until-exception interface to an iterator interface.
Like __builtin__.iter(func, sentinel) but uses an exception instead
of a sentinel to end the loop.
Examples:
bsddbiter = iter_except(db.next, bsddb.error, db.first)
heapiter = iter_except(functools.partial(heappop, h), IndexError)
dictiter = iter_except(d.popitem, KeyError)
dequeiter = iter_except(d.popleft, IndexError)
queueiter = iter_except(q.get_nowait, Queue.Empty)
setiter = iter_except(s.pop, KeyError)
"""
try:
if first is not None:
yield first()
while 1:
yield func()
except exception:
pass
Note, many of the above recipes can be optimized by replacing global lookups Note, many of the above recipes can be optimized by replacing global lookups
with local variables defined as default values. For example, the with local variables defined as default values. For example, the
*dotproduct* recipe can be written as:: *dotproduct* recipe can be written as::
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment