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})"