Easier and more self documenting patterns for loading/saving Persistent
[python_utils.git] / list_utils.py
index 7f28ade922a4b733ee29ea0c68bc957ff587c51b..8f92be30c45fba8531654895f7a03da29b18dae7 100644 (file)
@@ -1,10 +1,12 @@
 #!/usr/bin/env python3
 
+# © Copyright 2021-2022, Scott Gasch
+
 """Some useful(?) utilities for dealing with Lists."""
 
 import random
 from collections import Counter
-from itertools import islice
+from itertools import chain, combinations, islice
 from typing import Any, Iterator, List, MutableSequence, Sequence, Tuple
 
 
@@ -257,7 +259,7 @@ def scramble(seq: MutableSequence[Any]) -> MutableSequence[Any]:
     return shuffle(seq)
 
 
-def binary_search(lst: Sequence[Any], target: Any, *, sanity_check=False) -> Tuple[bool, int]:
+def binary_search(lst: Sequence[Any], target: Any) -> Tuple[bool, int]:
     """Performs a binary search on lst (which must already be sorted).
     Returns a Tuple composed of a bool which indicates whether the
     target was found and an int which indicates the index closest to
@@ -283,7 +285,7 @@ def binary_search(lst: Sequence[Any], target: Any, *, sanity_check=False) -> Tup
     AssertionError
 
     """
-    if sanity_check:
+    if __debug__:
         last = None
         for x in lst:
             if last is not None:
@@ -305,6 +307,23 @@ def _binary_search(lst: Sequence[Any], target: Any, low: int, high: int) -> Tupl
         return (False, low)
 
 
+def powerset(lst: Sequence[Any]) -> Iterator[Sequence[Any]]:
+    """Returns the powerset of the items in the input sequence.
+
+    >>> for x in powerset([1, 2, 3]):
+    ...     print(x)
+    ()
+    (1,)
+    (2,)
+    (3,)
+    (1, 2)
+    (1, 3)
+    (2, 3)
+    (1, 2, 3)
+    """
+    return chain.from_iterable(combinations(lst, r) for r in range(len(lst) + 1))
+
+
 if __name__ == '__main__':
     import doctest