@@ -1019,27 +1019,30 @@ which incur interpreter overhead.
1019
1019
def unique_everseen(iterable, key=None):
1020
1020
"List unique elements, preserving order. Remember all elements ever seen."
1021
1021
# unique_everseen('AAAABBBCCDAABBB') --> A B C D
1022
- # unique_everseen('ABBCcAD ', str.lower) --> A B C D
1022
+ # unique_everseen('ABBcCAD ', str.lower) --> A B c D
1023
1023
seen = set()
1024
1024
if key is None:
1025
1025
for element in filterfalse(seen.__contains__, iterable):
1026
1026
seen.add(element)
1027
1027
yield element
1028
- # Note: The steps shown above are intended to demonstrate
1029
- # filterfalse(). For order preserving deduplication,
1030
- # a better solution is:
1028
+ # For order preserving deduplication,
1029
+ # a faster but non-lazy solution is:
1031
1030
# yield from dict.fromkeys(iterable)
1032
1031
else:
1033
1032
for element in iterable:
1034
1033
k = key(element)
1035
1034
if k not in seen:
1036
1035
seen.add(k)
1037
1036
yield element
1037
+ # For use cases that allow the last matching element to be returned,
1038
+ # a faster but non-lazy solution is:
1039
+ # t1, t2 = tee(iterable)
1040
+ # yield from dict(zip(map(key, t1), t2)).values()
1038
1041
1039
1042
def unique_justseen(iterable, key=None):
1040
1043
"List unique elements, preserving order. Remember only the element just seen."
1041
1044
# unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
1042
- # unique_justseen('ABBCcAD ', str.lower) --> A B C A D
1045
+ # unique_justseen('ABBcCAD ', str.lower) --> A B c A D
1043
1046
return map(next, map(operator.itemgetter(1), groupby(iterable, key)))
1044
1047
1045
1048
def iter_except(func, exception, first=None):
@@ -1371,15 +1374,17 @@ which incur interpreter overhead.
1371
1374
1372
1375
>>> list (unique_everseen(' AAAABBBCCDAABBB' ))
1373
1376
['A', 'B', 'C', 'D']
1374
-
1375
1377
>>> list (unique_everseen(' ABBCcAD' , str .lower))
1376
1378
['A', 'B', 'C', 'D']
1379
+ >>> list (unique_everseen(' ABBcCAD' , str .lower))
1380
+ ['A', 'B', 'c', 'D']
1377
1381
1378
1382
>>> list (unique_justseen(' AAAABBBCCDAABBB' ))
1379
1383
['A', 'B', 'C', 'D', 'A', 'B']
1380
-
1381
1384
>>> list (unique_justseen(' ABBCcAD' , str .lower))
1382
1385
['A', 'B', 'C', 'A', 'D']
1386
+ >>> list (unique_justseen(' ABBcCAD' , str .lower))
1387
+ ['A', 'B', 'c', 'A', 'D']
1383
1388
1384
1389
>>> d = dict (a = 1 , b = 2 , c = 3 )
1385
1390
>>> it = iter_except(d.popitem, KeyError )
0 commit comments