Source code for titan_pylib.data_structures.safe_hash.hash_counter

 1from titan_pylib.data_structures.safe_hash.hash_dict import HashDict
 2from typing import Iterable, Iterator
 3
 4
[docs] 5class HashCounter: 6 7 def __init__(self, a: Iterable[int] = []) -> None: 8 self._data = HashDict() 9 for a_ in a: 10 if a_ in self._data: 11 self._data[a_] += 1 12 else: 13 self._data[a_] = 1 14 15 def __iter__(self) -> Iterator[tuple[int, int]]: 16 for k, v in self._data.items(): 17 yield k, v 18 19 def __setitem__(self, key: int, val: int) -> None: 20 self._data[key] = val 21 22 def __getitem__(self, key: int) -> int: 23 return self._data[key] if key in self._data else 0 24 25 def __delitem__(self, key: int) -> None: 26 if key in self._data: 27 del self._data[key] 28 29 def __contains__(self, key: int) -> bool: 30 return key in self._data 31
[docs] 32 def most_common(self) -> list[tuple[int, int]]: 33 return sorted(self._data.items(), key=lambda x: -x[1])
34
[docs] 35 def keys(self) -> Iterator[int]: 36 return self._data.keys()
37
[docs] 38 def values(self) -> Iterator[int]: 39 return self._data.values()
40
[docs] 41 def items(self) -> Iterable[tuple[int, int]]: 42 return self._data.items()
43 44 def __len__(self) -> int: 45 return len(self._data) 46 47 def __str__(self) -> str: 48 return f"{self.__class__.__name__}({str(self._data)})" 49 50 def __repr__(self) -> str: 51 return f"{self.__class__.__name__}({self})"