@@ -989,27 +989,30 @@ which incur interpreter overhead.
989
989
def unique_everseen(iterable, key=None):
990
990
"List unique elements, preserving order. Remember all elements ever seen."
991
991
# unique_everseen('AAAABBBCCDAABBB') --> A B C D
992
- # unique_everseen('ABBCcAD ', str.lower) --> A B C D
992
+ # unique_everseen('ABBcCAD ', str.lower) --> A B c D
993
993
seen = set()
994
994
if key is None:
995
995
for element in filterfalse(seen.__contains__, iterable):
996
996
seen.add(element)
997
997
yield element
998
- # Note: The steps shown above are intended to demonstrate
999
- # filterfalse(). For order preserving deduplication,
1000
- # a better solution is:
998
+ # For order preserving deduplication,
999
+ # a faster but non-lazy solution is:
1001
1000
# yield from dict.fromkeys(iterable)
1002
1001
else:
1003
1002
for element in iterable:
1004
1003
k = key(element)
1005
1004
if k not in seen:
1006
1005
seen.add(k)
1007
1006
yield element
1007
+ # For use cases that allow the last matching element to be returned,
1008
+ # a faster but non-lazy solution is:
1009
+ # t1, t2 = tee(iterable)
1010
+ # yield from dict(zip(map(key, t1), t2)).values()
1008
1011
1009
1012
def unique_justseen(iterable, key=None):
1010
1013
"List unique elements, preserving order. Remember only the element just seen."
1011
1014
# unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
1012
- # unique_justseen('ABBCcAD ', str.lower) --> A B C A D
1015
+ # unique_justseen('ABBcCAD ', str.lower) --> A B c A D
1013
1016
return map(next, map(operator.itemgetter(1), groupby(iterable, key)))
1014
1017
1015
1018
def iter_except(func, exception, first=None):
@@ -1365,15 +1368,17 @@ which incur interpreter overhead.
1365
1368
1366
1369
>>> list (unique_everseen(' AAAABBBCCDAABBB' ))
1367
1370
['A', 'B', 'C', 'D']
1368
-
1369
1371
>>> list (unique_everseen(' ABBCcAD' , str .lower))
1370
1372
['A', 'B', 'C', 'D']
1373
+ >>> list (unique_everseen(' ABBcCAD' , str .lower))
1374
+ ['A', 'B', 'c', 'D']
1371
1375
1372
1376
>>> list (unique_justseen(' AAAABBBCCDAABBB' ))
1373
1377
['A', 'B', 'C', 'D', 'A', 'B']
1374
-
1375
1378
>>> list (unique_justseen(' ABBCcAD' , str .lower))
1376
1379
['A', 'B', 'C', 'A', 'D']
1380
+ >>> list (unique_justseen(' ABBcCAD' , str .lower))
1381
+ ['A', 'B', 'c', 'A', 'D']
1377
1382
1378
1383
>>> d = dict (a = 1 , b = 2 , c = 3 )
1379
1384
>>> it = iter_except(d.popitem, KeyError )
0 commit comments