@@ -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