collections.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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 append(self, value):
  17. node = _LinkedListNode(self.tail.prev, self.tail, value)
  18. self.tail.prev.next = node
  19. self.tail.prev = node
  20. self.size += 1
  21. def appendleft(self, value):
  22. node = _LinkedListNode(self.head, self.head.next, value)
  23. self.head.next.prev = node
  24. self.head.next = node
  25. self.size += 1
  26. def pop(self):
  27. assert self.size > 0
  28. node = self.tail.prev
  29. node.prev.next = self.tail
  30. self.tail.prev = node.prev
  31. self.size -= 1
  32. return node.value
  33. def popleft(self):
  34. assert self.size > 0
  35. node = self.head.next
  36. node.next.prev = self.head
  37. self.head.next = node.next
  38. self.size -= 1
  39. return node.value
  40. def copy(self):
  41. new_list = deque()
  42. for value in self:
  43. new_list.append(value)
  44. return new_list
  45. def __len__(self):
  46. return self.size
  47. def __iter__(self):
  48. node = self.head.next
  49. while node is not self.tail:
  50. yield node.value
  51. node = node.next
  52. def __repr__(self) -> str:
  53. a = list(self)
  54. return f"deque({a})"
  55. def __eq__(self, __o: object) -> bool:
  56. if not isinstance(__o, deque):
  57. return False
  58. if len(self) != len(__o):
  59. return False
  60. t1, t2 = self.head.next, __o.head.next
  61. while t1 is not self.tail:
  62. if t1.value != t2.value:
  63. return False
  64. t1, t2 = t1.next, t2.next
  65. return True
  66. def Counter(iterable):
  67. a = {}
  68. for x in iterable:
  69. if x in a:
  70. a[x] += 1
  71. else:
  72. a[x] = 1
  73. return a
  74. class defaultdict:
  75. def __init__(self, default_factory) -> None:
  76. self.default_factory = default_factory
  77. self._a = {}
  78. def __getitem__(self, key):
  79. if key not in self._a:
  80. self._a[key] = self.default_factory()
  81. return self._a[key]
  82. def __setitem__(self, key, value):
  83. self._a[key] = value
  84. def __repr__(self) -> str:
  85. return f"defaultdict({self.default_factory}, {self._a})"
  86. def __eq__(self, __o: object) -> bool:
  87. if not isinstance(__o, defaultdict):
  88. return False
  89. if self.default_factory != __o.default_factory:
  90. return False
  91. return self._a == __o._a
  92. def __len__(self):
  93. return len(self._a)
  94. def keys(self):
  95. return self._a.keys()
  96. def values(self):
  97. return self._a.values()
  98. def items(self):
  99. return self._a.items()
  100. def pop(self, key):
  101. return self._a.pop(key)