Skip to content

Commit 60393f5

Browse files
[3.12] Add unique() recipe to itertools docs (gh-119911) (gh-119917)
1 parent 55f6515 commit 60393f5

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

Doc/library/itertools.rst

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -849,15 +849,15 @@ and :term:`generators <generator>` which incur interpreter overhead.
849849
return len(take(2, groupby(iterable, key))) <= 1
850850

851851
def unique_justseen(iterable, key=None):
852-
"List unique elements, preserving order. Remember only the element just seen."
852+
"Yield unique elements, preserving order. Remember only the element just seen."
853853
# unique_justseen('AAAABBBCCDAABBB') → A B C D A B
854854
# unique_justseen('ABBcCAD', str.casefold) → A B c A D
855855
if key is None:
856856
return map(operator.itemgetter(0), groupby(iterable))
857857
return map(next, map(operator.itemgetter(1), groupby(iterable, key)))
858858

859859
def unique_everseen(iterable, key=None):
860-
"List unique elements, preserving order. Remember all elements ever seen."
860+
"Yield unique elements, preserving order. Remember all elements ever seen."
861861
# unique_everseen('AAAABBBCCDAABBB') → A B C D
862862
# unique_everseen('ABBcCAD', str.casefold) → A B c D
863863
seen = set()
@@ -872,6 +872,11 @@ and :term:`generators <generator>` which incur interpreter overhead.
872872
seen.add(k)
873873
yield element
874874

875+
def unique(iterable, key=None, reverse=False):
876+
"Yield unique elements in sorted order. Supports unhashable inputs."
877+
# unique([[1, 2], [3, 4], [1, 2]]) → [1, 2] [3, 4]
878+
return unique_justseen(sorted(iterable, key=key, reverse=reverse), key=key)
879+
875880
def sliding_window(iterable, n):
876881
"Collect data into overlapping fixed-length chunks or blocks."
877882
# sliding_window('ABCDEFG', 4) → ABCD BCDE CDEF DEFG
@@ -1593,6 +1598,13 @@ The following recipes have a more mathematical flavor:
15931598
>>> ''.join(input_iterator)
15941599
'AAABBBCCDAABBB'
15951600

1601+
>>> list(unique([[1, 2], [3, 4], [1, 2]]))
1602+
[[1, 2], [3, 4]]
1603+
>>> list(unique('ABBcCAD', str.casefold))
1604+
['A', 'B', 'c', 'D']
1605+
>>> list(unique('ABBcCAD', str.casefold, reverse=True))
1606+
['D', 'c', 'B', 'A']
1607+
15961608
>>> d = dict(a=1, b=2, c=3)
15971609
>>> it = iter_except(d.popitem, KeyError)
15981610
>>> d['d'] = 4

0 commit comments

Comments
 (0)