collections.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. class _LinkedListNode:
  2. def __init__(self, prev, next, value) -> None:
  3. self.prev = prev
  4. self.next = next
  5. self.value = value
  6. class deque:
  7. def __init__(self, iterable=None) -> None:
  8. self.head = _LinkedListNode(None, None, None)
  9. self.tail = _LinkedListNode(None, None, None)
  10. self.head.next = self.tail
  11. self.tail.prev = self.head
  12. self.size = 0
  13. if iterable is not None:
  14. for value in iterable:
  15. self.append(value)
  16. def __getitem__(self, index):
  17. assert 0 <= index < len(self)
  18. node = self.head.next
  19. for _ in range(index):
  20. node = node.next
  21. return node.value
  22. def __setitem__(self, index, value):
  23. assert 0 <= index < len(self)
  24. node = self.head.next
  25. for _ in range(index):
  26. node = node.next
  27. node.value = value
  28. def __delitem__(self, index):
  29. assert 0 <= index < len(self)
  30. node = self.head.next
  31. for _ in range(index):
  32. node = node.next
  33. node.prev.next = node.next
  34. node.next.prev = node.prev
  35. self.size -= 1
  36. def clear(self):
  37. self.head.next = self.tail
  38. self.tail.prev = self.head
  39. self.size = 0
  40. def append(self, value):
  41. node = _LinkedListNode(self.tail.prev, self.tail, value)
  42. self.tail.prev.next = node
  43. self.tail.prev = node
  44. self.size += 1
  45. def appendleft(self, value):
  46. node = _LinkedListNode(self.head, self.head.next, value)
  47. self.head.next.prev = node
  48. self.head.next = node
  49. self.size += 1
  50. def pop(self):
  51. assert self.size > 0
  52. node = self.tail.prev
  53. node.prev.next = self.tail
  54. self.tail.prev = node.prev
  55. self.size -= 1
  56. return node.value
  57. def popleft(self):
  58. assert self.size > 0
  59. node = self.head.next
  60. node.next.prev = self.head
  61. self.head.next = node.next
  62. self.size -= 1
  63. return node.value
  64. def copy(self):
  65. new_list = deque()
  66. for value in self:
  67. new_list.append(value)
  68. return new_list
  69. def __len__(self):
  70. return self.size
  71. def __iter__(self):
  72. node = self.head.next
  73. while node is not self.tail:
  74. yield node.value
  75. node = node.next
  76. def __repr__(self) -> str:
  77. a = list(self)
  78. return f"deque({a})"
  79. def __eq__(self, __o: object) -> bool:
  80. if not isinstance(__o, deque):
  81. return False
  82. if len(self) != len(__o):
  83. return False
  84. t1, t2 = self.head.next, __o.head.next
  85. while t1 is not self.tail:
  86. if t1.value != t2.value:
  87. return False
  88. t1, t2 = t1.next, t2.next
  89. return True
  90. def Counter(iterable):
  91. a = {}
  92. for x in iterable:
  93. if x in a:
  94. a[x] += 1
  95. else:
  96. a[x] = 1
  97. return a
  98. class defaultdict:
  99. def __init__(self, default_factory) -> None:
  100. self.default_factory = default_factory
  101. self._a = {}
  102. def __getitem__(self, key):
  103. if key not in self._a:
  104. self._a[key] = self.default_factory()
  105. return self._a[key]
  106. def __setitem__(self, key, value):
  107. self._a[key] = value
  108. def __repr__(self) -> str:
  109. return f"defaultdict({self.default_factory}, {self._a})"
  110. def __eq__(self, __o: object) -> bool:
  111. if not isinstance(__o, defaultdict):
  112. return False
  113. if self.default_factory != __o.default_factory:
  114. return False
  115. return self._a == __o._a
  116. def __iter__(self):
  117. return iter(self._a)
  118. def __contains__(self, key):
  119. return key in self._a
  120. def __len__(self):
  121. return len(self._a)
  122. def keys(self):
  123. return self._a.keys()
  124. def values(self):
  125. return self._a.values()
  126. def items(self):
  127. return self._a.items()
  128. def pop(self, key):
  129. return self._a.pop(key)