hashed_multiset

ソースコード

from titan_pylib.data_structures.set.hashed_multiset import HashedMultiset

view on github

展開済みコード

 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

仕様

class HashedMultiset(a: list[Hashable] = [])[source]

Bases: object

add(key: Hashable, val: int = 1) None[source]
clear() None[source]
count(key: Hashable) int[source]
discard(key: Hashable, val: int = 1) None[source]
discard_all(key: Hashable) None[source]
items() Iterator[Hashable][source]
keys() Iterator[Hashable][source]
len_elm() int[source]
values() Iterator[int][source]