@@ -857,15 +857,15 @@ and :term:`generators <generator>` which incur interpreter overhead.
857
857
return len(take(2, groupby(iterable, key))) <= 1
858
858
859
859
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."
861
861
# unique_justseen('AAAABBBCCDAABBB') → A B C D A B
862
862
# unique_justseen('ABBcCAD', str.casefold) → A B c A D
863
863
if key is None:
864
864
return map(operator.itemgetter(0), groupby(iterable))
865
865
return map(next, map(operator.itemgetter(1), groupby(iterable, key)))
866
866
867
867
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."
869
869
# unique_everseen('AAAABBBCCDAABBB') → A B C D
870
870
# unique_everseen('ABBcCAD', str.casefold) → A B c D
871
871
seen = set()
@@ -880,6 +880,11 @@ and :term:`generators <generator>` which incur interpreter overhead.
880
880
seen.add(k)
881
881
yield element
882
882
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
+
883
888
def sliding_window(iterable, n):
884
889
"Collect data into overlapping fixed-length chunks or blocks."
885
890
# sliding_window('ABCDEFG', 4) → ABCD BCDE CDEF DEFG
@@ -1605,6 +1610,13 @@ The following recipes have a more mathematical flavor:
1605
1610
>>> ' ' .join(input_iterator)
1606
1611
'AAABBBCCDAABBB'
1607
1612
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
+
1608
1620
>>> d = dict (a = 1 , b = 2 , c = 3 )
1609
1621
>>> it = iter_except(d.popitem, KeyError )
1610
1622
>>> d[' d' ] = 4
0 commit comments