_dict.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. class dict:
  2. def __init__(self, mapping=None):
  3. self._capacity = 16
  4. self._a = [None] * self._capacity
  5. self._len = 0
  6. if mapping is not None:
  7. for k,v in mapping:
  8. self[k] = v
  9. def __len__(self):
  10. return self._len
  11. def __probe(self, key):
  12. i = hash(key) % self._capacity
  13. while self._a[i] is not None:
  14. if self._a[i][0] == key:
  15. return True, i
  16. i = (i + 1) % self._capacity
  17. return False, i
  18. def __getitem__(self, key):
  19. ok, i = self.__probe(key)
  20. if not ok:
  21. raise KeyError(repr(key))
  22. return self._a[i][1]
  23. def __contains__(self, key):
  24. ok, i = self.__probe(key)
  25. return ok
  26. def __setitem__(self, key, value):
  27. ok, i = self.__probe(key)
  28. if ok:
  29. self._a[i][1] = value
  30. else:
  31. self._a[i] = [key, value]
  32. self._len += 1
  33. if self._len > self._capacity * 0.67:
  34. self._capacity *= 2
  35. self.__rehash()
  36. def __delitem__(self, key):
  37. ok, i = self.__probe(key)
  38. if not ok:
  39. raise KeyError(repr(key))
  40. self._a[i] = None
  41. self._len -= 1
  42. def __rehash(self):
  43. old_a = self._a
  44. self._a = [None] * self._capacity
  45. self._len = 0
  46. for kv in old_a:
  47. if kv is not None:
  48. self[kv[0]] = kv[1]
  49. def get(self, key, default=None):
  50. ok, i = self.__probe(key)
  51. if ok:
  52. return self._a[i][1]
  53. return default
  54. def keys(self):
  55. for kv in self._a:
  56. if kv is not None:
  57. yield kv[0]
  58. def values(self):
  59. for kv in self._a:
  60. if kv is not None:
  61. yield kv[1]
  62. def items(self):
  63. for kv in self._a:
  64. if kv is not None:
  65. yield kv
  66. def clear(self):
  67. self._a = [None] * self._capacity
  68. self._len = 0
  69. def update(self, other):
  70. for k, v in other.items():
  71. self[k] = v
  72. def copy(self):
  73. d = dict()
  74. for kv in self._a:
  75. if kv is not None:
  76. d[kv[0]] = kv[1]
  77. return d
  78. def __repr__(self):
  79. a = [repr(k)+': '+repr(v) for k,v in self.items()]
  80. return '{'+ ', '.join(a) + '}'
  81. def __json__(self):
  82. a = []
  83. for k,v in self.items():
  84. if type(k) is not str:
  85. raise TypeError('json keys must be strings, got ' + repr(k) )
  86. a.append(k.__json__()+': '+v.__json__())
  87. return '{'+ ', '.join(a) + '}'
  88. def __eq__(self, __o: object) -> bool:
  89. if type(__o) is not dict:
  90. return False
  91. if len(self) != len(__o):
  92. return False
  93. for k in self.keys():
  94. if k not in __o:
  95. return False
  96. if self[k] != __o[k]:
  97. return False
  98. return True
  99. def __ne__(self, __o: object) -> bool:
  100. return not self.__eq__(__o)