collections.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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 extend(self, iterable):
  41. # for value in iterable:
  42. # self.append(value)
  43. # def append(self, value):
  44. # node = _LinkedListNode(self.tail.prev, self.tail, value)
  45. # self.tail.prev.next = node
  46. # self.tail.prev = node
  47. # self.size += 1
  48. # def appendleft(self, value):
  49. # node = _LinkedListNode(self.head, self.head.next, value)
  50. # self.head.next.prev = node
  51. # self.head.next = node
  52. # self.size += 1
  53. # def pop(self):
  54. # assert self.size > 0
  55. # node = self.tail.prev
  56. # node.prev.next = self.tail
  57. # self.tail.prev = node.prev
  58. # self.size -= 1
  59. # return node.value
  60. # def popleft(self):
  61. # assert self.size > 0
  62. # node = self.head.next
  63. # node.next.prev = self.head
  64. # self.head.next = node.next
  65. # self.size -= 1
  66. # return node.value
  67. # def copy(self):
  68. # new_list = deque()
  69. # for value in self:
  70. # new_list.append(value)
  71. # return new_list
  72. # def __len__(self):
  73. # return self.size
  74. # def __iter__(self):
  75. # node = self.head.next
  76. # while node is not self.tail:
  77. # yield node.value
  78. # node = node.next
  79. # def __repr__(self) -> str:
  80. # a = list(self)
  81. # return f"deque({a})"
  82. # def __eq__(self, __o: object) -> bool:
  83. # if not isinstance(__o, deque):
  84. # return False
  85. # if len(self) != len(__o):
  86. # return False
  87. # t1, t2 = self.head.next, __o.head.next
  88. # while t1 is not self.tail:
  89. # if t1.value != t2.value:
  90. # return False
  91. # t1, t2 = t1.next, t2.next
  92. # return True
  93. def Counter(iterable):
  94. a = {}
  95. for x in iterable:
  96. if x in a:
  97. a[x] += 1
  98. else:
  99. a[x] = 1
  100. return a
  101. class defaultdict:
  102. def __init__(self, default_factory) -> None:
  103. self.default_factory = default_factory
  104. self._a = {}
  105. def __getitem__(self, key):
  106. if key not in self._a:
  107. self._a[key] = self.default_factory()
  108. return self._a[key]
  109. def __setitem__(self, key, value):
  110. self._a[key] = value
  111. def __repr__(self) -> str:
  112. return f"defaultdict({self.default_factory}, {self._a})"
  113. def __eq__(self, __o: object) -> bool:
  114. if not isinstance(__o, defaultdict):
  115. return False
  116. if self.default_factory != __o.default_factory:
  117. return False
  118. return self._a == __o._a
  119. def __iter__(self):
  120. return iter(self._a)
  121. def __contains__(self, key):
  122. return key in self._a
  123. def __len__(self):
  124. return len(self._a)
  125. def keys(self):
  126. return self._a.keys()
  127. def values(self):
  128. return self._a.values()
  129. def items(self):
  130. return self._a.items()
  131. def pop(self, *args):
  132. return self._a.pop(*args)