1
0

collections.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. from typing import TypeVar, Iterable
  2. def Counter[T](iterable: Iterable[T]):
  3. a: dict[T, int] = {}
  4. for x in iterable:
  5. if x in a:
  6. a[x] += 1
  7. else:
  8. a[x] = 1
  9. return a
  10. class defaultdict(dict):
  11. def __init__(self, default_factory, *args):
  12. super().__init__(*args)
  13. self.default_factory = default_factory
  14. def __missing__(self, key):
  15. self[key] = self.default_factory()
  16. return self[key]
  17. def __repr__(self) -> str:
  18. return f"defaultdict({self.default_factory}, {super().__repr__()})"
  19. def copy(self):
  20. return defaultdict(self.default_factory, self)
  21. class deque[T]:
  22. _head: int
  23. _tail: int
  24. _maxlen: int | None
  25. _capacity: int
  26. _data: list[T]
  27. def __init__(self, iterable: Iterable[T] = None, maxlen: int | None = None):
  28. if maxlen is not None:
  29. assert maxlen > 0
  30. self._head = 0
  31. self._tail = 0
  32. self._maxlen = maxlen
  33. self._capacity = 8 if maxlen is None else maxlen + 1
  34. self._data = [None] * self._capacity # type: ignore
  35. if iterable is not None:
  36. self.extend(iterable)
  37. @property
  38. def maxlen(self) -> int | None:
  39. return self._maxlen
  40. def __resize_2x(self):
  41. backup = list(self)
  42. self._capacity *= 2
  43. self._head = 0
  44. self._tail = len(backup)
  45. self._data.clear()
  46. self._data.extend(backup)
  47. self._data.extend([None] * (self._capacity - len(backup)))
  48. def append(self, x: T):
  49. if (self._tail + 1) % self._capacity == self._head:
  50. if self._maxlen is None:
  51. self.__resize_2x()
  52. else:
  53. self.popleft()
  54. self._data[self._tail] = x
  55. self._tail = (self._tail + 1) % self._capacity
  56. def appendleft(self, x: T):
  57. if (self._tail + 1) % self._capacity == self._head:
  58. if self._maxlen is None:
  59. self.__resize_2x()
  60. else:
  61. self.pop()
  62. self._head = (self._head - 1) % self._capacity
  63. self._data[self._head] = x
  64. def copy(self):
  65. return deque(self, maxlen=self.maxlen)
  66. def count(self, x: T) -> int:
  67. n = 0
  68. for item in self:
  69. if item == x:
  70. n += 1
  71. return n
  72. def extend(self, iterable: Iterable[T]):
  73. for x in iterable:
  74. self.append(x)
  75. def extendleft(self, iterable: Iterable[T]):
  76. for x in iterable:
  77. self.appendleft(x)
  78. def pop(self) -> T:
  79. if self._head == self._tail:
  80. raise IndexError("pop from an empty deque")
  81. self._tail = (self._tail - 1) % self._capacity
  82. x = self._data[self._tail]
  83. self._data[self._tail] = None
  84. return x
  85. def popleft(self) -> T:
  86. if self._head == self._tail:
  87. raise IndexError("pop from an empty deque")
  88. x = self._data[self._head]
  89. self._data[self._head] = None
  90. self._head = (self._head + 1) % self._capacity
  91. return x
  92. def clear(self):
  93. i = self._head
  94. while i != self._tail:
  95. self._data[i] = None # type: ignore
  96. i = (i + 1) % self._capacity
  97. self._head = 0
  98. self._tail = 0
  99. def rotate(self, n: int = 1):
  100. if len(self) == 0:
  101. return
  102. if n > 0:
  103. n = n % len(self)
  104. for _ in range(n):
  105. self.appendleft(self.pop())
  106. elif n < 0:
  107. n = -n % len(self)
  108. for _ in range(n):
  109. self.append(self.popleft())
  110. def __len__(self) -> int:
  111. return (self._tail - self._head) % self._capacity
  112. def __contains__(self, x: object) -> bool:
  113. for item in self:
  114. if item == x:
  115. return True
  116. return False
  117. def __iter__(self):
  118. i = self._head
  119. while i != self._tail:
  120. yield self._data[i]
  121. i = (i + 1) % self._capacity
  122. def __eq__(self, other: object) -> bool:
  123. if not isinstance(other, deque):
  124. return NotImplemented
  125. if len(self) != len(other):
  126. return False
  127. for x, y in zip(self, other):
  128. if x != y:
  129. return False
  130. return True
  131. def __ne__(self, other: object) -> bool:
  132. if not isinstance(other, deque):
  133. return NotImplemented
  134. return not self == other
  135. def __repr__(self) -> str:
  136. if self.maxlen is None:
  137. return f"deque({list(self)!r})"
  138. return f"deque({list(self)!r}, maxlen={self.maxlen})"