diff options
author | Stan Seibert <stan@mtrr.org> | 2011-06-21 20:59:54 -0400 |
---|---|---|
committer | Stan Seibert <stan@mtrr.org> | 2011-06-21 20:59:54 -0400 |
commit | ff489255117030ea263225cd1bc7b2f4f151ed76 (patch) | |
tree | fd36717bab2f359850da42f80d45054e79216e47 /itertoolset.py | |
parent | 81c4bf14e0357b597570dbb551a37c54cc1806de (diff) | |
parent | f04ecc51cd9d634a7c418a611946944b05c6bec4 (diff) | |
download | chroma-ff489255117030ea263225cd1bc7b2f4f151ed76.tar.gz chroma-ff489255117030ea263225cd1bc7b2f4f151ed76.tar.bz2 chroma-ff489255117030ea263225cd1bc7b2f4f151ed76.zip |
Merge speedup of build()
Diffstat (limited to 'itertoolset.py')
-rw-r--r-- | itertoolset.py | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/itertoolset.py b/itertoolset.py index 13bb896..ae4be8a 100644 --- a/itertoolset.py +++ b/itertoolset.py @@ -1,4 +1,4 @@ -from itertools import cycle, islice +from itertools import * def roundrobin(*iterables): """roundrobin('ABC', 'D', 'EF') --> A D E B F C""" @@ -11,3 +11,20 @@ def roundrobin(*iterables): 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 |