@@ -857,15 +857,15 @@ and :term:`generators <generator>` which incur interpreter overhead.
857857 return len(take(2, groupby(iterable, key))) <= 1
858858
859859 def unique_justseen(iterable, key=None):
860- "List unique elements, preserving order. Remember only the element just seen."
860+ "Yield unique elements, preserving order. Remember only the element just seen."
861861 # unique_justseen('AAAABBBCCDAABBB') → A B C D A B
862862 # unique_justseen('ABBcCAD', str.casefold) → A B c A D
863863 if key is None:
864864 return map(operator.itemgetter(0), groupby(iterable))
865865 return map(next, map(operator.itemgetter(1), groupby(iterable, key)))
866866
867867 def unique_everseen(iterable, key=None):
868- "List unique elements, preserving order. Remember all elements ever seen."
868+ "Yield unique elements, preserving order. Remember all elements ever seen."
869869 # unique_everseen('AAAABBBCCDAABBB') → A B C D
870870 # unique_everseen('ABBcCAD', str.casefold) → A B c D
871871 seen = set()
@@ -880,6 +880,11 @@ and :term:`generators <generator>` which incur interpreter overhead.
880880 seen.add(k)
881881 yield element
882882
883+ def unique(iterable, key=None, reverse=False):
884+ "Yield unique elements in sorted order. Supports unhashable inputs."
885+ # unique([[1, 2], [3, 4], [1, 2]]) → [1, 2] [3, 4]
886+ return unique_justseen(sorted(iterable, key=key, reverse=reverse), key=key)
887+
883888 def sliding_window(iterable, n):
884889 "Collect data into overlapping fixed-length chunks or blocks."
885890 # sliding_window('ABCDEFG', 4) → ABCD BCDE CDEF DEFG
@@ -1605,6 +1610,13 @@ The following recipes have a more mathematical flavor:
16051610 >>> ' ' .join(input_iterator)
16061611 'AAABBBCCDAABBB'
16071612
1613+ >>> list (unique([[1 , 2 ], [3 , 4 ], [1 , 2 ]]))
1614+ [[1, 2], [3, 4]]
1615+ >>> list (unique(' ABBcCAD' , str .casefold))
1616+ ['A', 'B', 'c', 'D']
1617+ >>> list (unique(' ABBcCAD' , str .casefold, reverse = True ))
1618+ ['D', 'c', 'B', 'A']
1619+
16081620 >>> d = dict (a = 1 , b = 2 , c = 3 )
16091621 >>> it = iter_except(d.popitem, KeyError )
16101622 >>> d[' d' ] = 4
0 commit comments