@@ -1298,6 +1298,30 @@ def __init__(self, newarg=None, *args):
12981298... indices[i:] = [indices[i] + 1] * (r - i)
12991299... yield tuple(pool[i] for i in indices)
13001300
1301+ >>> def unique_everseen(iterable, key=None):
1302+ ... "List unique elements, preserving order. Remember all elements ever seen."
1303+ ... # unique_everseen('AAAABBBCCDAABBB') --> A B C D
1304+ ... # unique_everseen('ABBCcAD', str.lower) --> A B C D
1305+ ... seen = set()
1306+ ... seen_add = seen.add
1307+ ... if key is None:
1308+ ... for element in iterable:
1309+ ... if element not in seen:
1310+ ... seen_add(element)
1311+ ... yield element
1312+ ... else:
1313+ ... for element in iterable:
1314+ ... k = key(element)
1315+ ... if k not in seen:
1316+ ... seen_add(k)
1317+ ... yield element
1318+
1319+ >>> def unique_justseen(iterable, key=None):
1320+ ... "List unique elements, preserving order. Remember only the element just seen."
1321+ ... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
1322+ ... # unique_justseen('ABBCcAD', str.lower) --> A B C A D
1323+ ... return map(next, map(itemgetter(1), groupby(iterable, key)))
1324+
13011325This is not part of the examples but it tests to make sure the definitions
13021326perform as purported.
13031327
@@ -1360,6 +1384,18 @@ def __init__(self, newarg=None, *args):
13601384>>> list(combinations_with_replacement('abc', 2))
13611385[('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')]
13621386
1387+ >>> list(unique_everseen('AAAABBBCCDAABBB'))
1388+ ['A', 'B', 'C', 'D']
1389+
1390+ >>> list(unique_everseen('ABBCcAD', str.lower))
1391+ ['A', 'B', 'C', 'D']
1392+
1393+ >>> list(unique_justseen('AAAABBBCCDAABBB'))
1394+ ['A', 'B', 'C', 'D', 'A', 'B']
1395+
1396+ >>> list(unique_justseen('ABBCcAD', str.lower))
1397+ ['A', 'B', 'C', 'A', 'D']
1398+
13631399"""
13641400
13651401__test__ = {'libreftest' : libreftest }
0 commit comments