X-Git-Url: https://wannabe.guru.org/gitweb/?a=blobdiff_plain;f=list_utils.py;h=c04a5343be656b62a07fc0d6af8b9b9880b5feda;hb=0bc6e4312cad0f997751739e750954ac39dfa6cc;hp=74f1cf3078457d371194deb33ddf5ad6410ed599;hpb=3bc4daf1edc121cd633429187392227f2fa61885;p=python_utils.git diff --git a/list_utils.py b/list_utils.py index 74f1cf3..c04a534 100644 --- a/list_utils.py +++ b/list_utils.py @@ -1,23 +1,102 @@ #!/usr/bin/env python3 +from collections import Counter from itertools import islice -from typing import Any, Iterator, List +from typing import Any, Iterator, List, Mapping def shard(lst: List[Any], size: int) -> Iterator[Any]: - """Yield successive size-sized shards from lst.""" + """ + Yield successive size-sized shards from lst. + + >>> for sublist in shard([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 3): + ... [_ for _ in sublist] + [1, 2, 3] + [4, 5, 6] + [7, 8, 9] + [10, 11, 12] + + """ for x in range(0, len(lst), size): yield islice(lst, x, x + size) def flatten(lst: List[Any]) -> List[Any]: - """Flatten out a list: + """ + Flatten out a list: + + >>> flatten([ 1, [2, 3, 4, [5], 6], 7, [8, [9]]]) + [1, 2, 3, 4, 5, 6, 7, 8, 9] - >>> flatten([ 1, [2, 3, 4, [5], 6], 7, [8, [9]]]) - [1, 2, 3, 4, 5, 6, 7, 8, 9] """ if len(lst) == 0: return lst if isinstance(lst[0], list): return flatten(lst[0]) + flatten(lst[1:]) return lst[:1] + flatten(lst[1:]) + + +def prepend(item: Any, lst: List[Any]) -> List[Any]: + """ + Prepend an item to a list. + + >>> prepend('foo', ['bar', 'baz']) + ['foo', 'bar', 'baz'] + + """ + lst.insert(0, item) + return lst + + +def population_counts(lst: List[Any]) -> Mapping[Any, int]: + """ + Return a population count mapping for the list (i.e. the keys are + list items and the values are the number of occurrances of that + list item in the original list. + + >>> population_counts([1, 1, 1, 2, 2, 3, 3, 3, 4]) + Counter({1: 3, 3: 3, 2: 2, 4: 1}) + + """ + return Counter(lst) + + +def most_common_item(lst: List[Any]) -> Any: + + """ + Return the most common item in the list. In the case of ties, + which most common item is returned will be random. + + >>> most_common_item([1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4]) + 3 + + """ + return population_counts(lst).most_common(1)[0][0] + + +def least_common_item(lst: List[Any]) -> Any: + """ + Return the least common item in the list. In the case of + ties, which least common item is returned will be random. + + >>> least_common_item([1, 1, 1, 2, 2, 3, 3, 3, 4]) + 4 + + """ + return population_counts(lst).most_common()[-1][0] + + +def dedup_list(lst: List[Any]) -> List[Any]: + """ + Remove duplicates from the list performantly. + + >>> dedup_list([1, 2, 1, 3, 3, 4, 2, 3, 4, 5, 1]) + [1, 2, 3, 4, 5] + + """ + return list(set(lst)) + + +if __name__ == '__main__': + import doctest + doctest.testmod()