#!/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
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
AssertionError
"""
- if sanity_check:
+ if __debug__:
last = None
for x in lst:
if last is not None:
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