hashed_multiset¶
ソースコード¶
from titan_pylib.data_structures.set.hashed_multiset import HashedMultiset
展開済みコード¶
1# from titan_pylib.data_structures.set.hashed_multiset import HashedMultiset
2from typing import Iterator, Hashable
3
4
5class HashedMultiset:
6
7 def __init__(self, a: list[Hashable] = []):
8 d = {}
9 for e in a:
10 if e in d:
11 d[e] += 1
12 else:
13 d[e] = 1
14 self._data = d
15 self._len = len(a)
16
17 def add(self, key: Hashable, val: int = 1) -> None:
18 if key in self._data:
19 self._data[key] += val
20 else:
21 self._data[key] = val
22 self._len += val
23
24 def discard(self, key: Hashable, val: int = 1) -> None:
25 if key not in self._data:
26 return
27 if self._data[key] > val:
28 self._len -= val
29 self._data[key] -= val
30 else:
31 self._len -= self._data[key]
32 del self._data[key]
33
34 def discard_all(self, key: Hashable) -> None:
35 if key not in self._data:
36 return
37 self._len -= self._data[key]
38 del self._data[key]
39
40 def count(self, key: Hashable) -> int:
41 return self._data.get(key, 0)
42
43 def len_elm(self) -> int:
44 return len(self._data)
45
46 def keys(self) -> Iterator[Hashable]:
47 for k in self._data.keys():
48 yield k
49
50 def values(self) -> Iterator[int]:
51 for v in self._data.values():
52 yield v
53
54 def items(self) -> Iterator[Hashable]:
55 for item in self._data.items():
56 yield item
57
58 def clear(self) -> None:
59 self._data = {}
60 self._len = 0
61 self._len_elm = 0
62
63 def __eq__(self, other):
64 if isinstance(other, HashedMultiset):
65 d = other._data
66 elif hasattr(other, "items"):
67 d = other
68 else:
69 raise TypeError
70 for k, v in self._data.items():
71 if k not in d or d[k] != v:
72 return False
73 for k, v in d.items():
74 if k not in self._data or self._data[k] != v:
75 return False
76 return True
77
78 def __contains__(self, key: Hashable):
79 return key in self._data
80
81 def __len__(self):
82 return self._len