collections.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. return f"deque({list(self)})"
  54. def __eq__(self, __o: object) -> bool:
  55. if not isinstance(__o, deque):
  56. return False
  57. if len(self) != len(__o):
  58. return False
  59. t1, t2 = self.head.next, __o.head.next
  60. while t1 is not self.tail:
  61. if t1.value != t2.value:
  62. return False
  63. t1, t2 = t1.next, t2.next
  64. return True
  65. def __ne__(self, __o: object) -> bool:
  66. return not self == __o
  67. def Counter(iterable):
  68. a = {}
  69. for x in iterable:
  70. if x in a:
  71. a[x] += 1
  72. else:
  73. a[x] = 1
  74. return a