dict.py 2.5 KB

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