@@ -849,15 +849,15 @@ and :term:`generators <generator>` which incur interpreter overhead.
849
849
return len(take(2, groupby(iterable, key))) <= 1
850
850
851
851
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."
853
853
# unique_justseen('AAAABBBCCDAABBB') → A B C D A B
854
854
# unique_justseen('ABBcCAD', str.casefold) → A B c A D
855
855
if key is None:
856
856
return map(operator.itemgetter(0), groupby(iterable))
857
857
return map(next, map(operator.itemgetter(1), groupby(iterable, key)))
858
858
859
859
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."
861
861
# unique_everseen('AAAABBBCCDAABBB') → A B C D
862
862
# unique_everseen('ABBcCAD', str.casefold) → A B c D
863
863
seen = set()
@@ -872,6 +872,11 @@ and :term:`generators <generator>` which incur interpreter overhead.
872
872
seen.add(k)
873
873
yield element
874
874
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
+
875
880
def sliding_window(iterable, n):
876
881
"Collect data into overlapping fixed-length chunks or blocks."
877
882
# sliding_window('ABCDEFG', 4) → ABCD BCDE CDEF DEFG
@@ -1593,6 +1598,13 @@ The following recipes have a more mathematical flavor:
1593
1598
>>> ' ' .join(input_iterator)
1594
1599
'AAABBBCCDAABBB'
1595
1600
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
+
1596
1608
>>> d = dict (a = 1 , b = 2 , c = 3 )
1597
1609
>>> it = iter_except(d.popitem, KeyError )
1598
1610
>>> d[' d' ] = 4
0 commit comments