Source code for graphdot.util.iterable

#!/usr/bin/env python
# -*- coding: utf-8 -*-


[docs]def flatten(iterable): '''Iterate through a tree of iterables in depth-first order. E.g. :py:`flatten(((1, 2), 3))` yields the sequence of :py:`1, 2, 3`.''' for item in iterable: if isinstance(item, (list, tuple)): yield from flatten(item) else: yield item
[docs]def fold_like(flat, example): '''Create a tree of iterables from an input linear sequence and a structure template. E.g. :py:`fold_like([1, 2, 3], ((None, None), None))` yields :py:`((1, 2), 3)`.''' folded = [] for item in example: if hasattr(item, '__iter__'): n = len(list(flatten(item))) folded.append(fold_like(flat[:n], item)) flat = flat[n:] else: folded.append(flat[0]) flat = flat[1:] return tuple(folded)
[docs]def replace(iterable, old, new): '''Replace all occurrences of `old` to `new`.''' for item in iterable: if item == old: yield new else: yield item
[docs]def argmax(iterable, less): best = None for i in iterable: if best is None or less(best, i): best = i return best