[3.11] Improve comments in itertools uniquification recipes (GH-100631) (GH-100632)

This commit is contained in:
Miss Islington (bot) 2022-12-30 20:23:39 -08:00 committed by GitHub
parent b1e314ab9f
commit 18006309ea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -989,15 +989,14 @@ which incur interpreter overhead.
def unique_everseen(iterable, key=None): def unique_everseen(iterable, key=None):
"List unique elements, preserving order. Remember all elements ever seen." "List unique elements, preserving order. Remember all elements ever seen."
# unique_everseen('AAAABBBCCDAABBB') --> A B C D # unique_everseen('AAAABBBCCDAABBB') --> A B C D
# unique_everseen('ABBCcAD', str.lower) --> A B C D # unique_everseen('ABBcCAD', str.lower) --> A B c D
seen = set() seen = set()
if key is None: if key is None:
for element in filterfalse(seen.__contains__, iterable): for element in filterfalse(seen.__contains__, iterable):
seen.add(element) seen.add(element)
yield element yield element
# Note: The steps shown above are intended to demonstrate # For order preserving deduplication,
# filterfalse(). For order preserving deduplication, # a faster but non-lazy solution is:
# a better solution is:
# yield from dict.fromkeys(iterable) # yield from dict.fromkeys(iterable)
else: else:
for element in iterable: for element in iterable:
@ -1005,11 +1004,15 @@ which incur interpreter overhead.
if k not in seen: if k not in seen:
seen.add(k) seen.add(k)
yield element yield element
# For use cases that allow the last matching element to be returned,
# a faster but non-lazy solution is:
# t1, t2 = tee(iterable)
# yield from dict(zip(map(key, t1), t2)).values()
def unique_justseen(iterable, key=None): def unique_justseen(iterable, key=None):
"List unique elements, preserving order. Remember only the element just seen." "List unique elements, preserving order. Remember only the element just seen."
# unique_justseen('AAAABBBCCDAABBB') --> A B C D A B # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
# unique_justseen('ABBCcAD', str.lower) --> A B C A D # unique_justseen('ABBcCAD', str.lower) --> A B c A D
return map(next, map(operator.itemgetter(1), groupby(iterable, key))) return map(next, map(operator.itemgetter(1), groupby(iterable, key)))
def iter_except(func, exception, first=None): def iter_except(func, exception, first=None):
@ -1365,15 +1368,17 @@ which incur interpreter overhead.
>>> list(unique_everseen('AAAABBBCCDAABBB')) >>> list(unique_everseen('AAAABBBCCDAABBB'))
['A', 'B', 'C', 'D'] ['A', 'B', 'C', 'D']
>>> list(unique_everseen('ABBCcAD', str.lower)) >>> list(unique_everseen('ABBCcAD', str.lower))
['A', 'B', 'C', 'D'] ['A', 'B', 'C', 'D']
>>> list(unique_everseen('ABBcCAD', str.lower))
['A', 'B', 'c', 'D']
>>> list(unique_justseen('AAAABBBCCDAABBB')) >>> list(unique_justseen('AAAABBBCCDAABBB'))
['A', 'B', 'C', 'D', 'A', 'B'] ['A', 'B', 'C', 'D', 'A', 'B']
>>> list(unique_justseen('ABBCcAD', str.lower)) >>> list(unique_justseen('ABBCcAD', str.lower))
['A', 'B', 'C', 'A', 'D'] ['A', 'B', 'C', 'A', 'D']
>>> list(unique_justseen('ABBcCAD', str.lower))
['A', 'B', 'c', 'A', 'D']
>>> d = dict(a=1, b=2, c=3) >>> d = dict(a=1, b=2, c=3)
>>> it = iter_except(d.popitem, KeyError) >>> it = iter_except(d.popitem, KeyError)