Skip to content

Commit eb393e9

Browse files
committed
Added python dict interface
1 parent 73cd894 commit eb393e9

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

hashtable.py

+30-1
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,22 @@ def hash_function(key_str, size):
55

66
############ HashTable class
77
class HashTable:
8-
""" Hash table which uses strings for keys. Value can be any object. """
8+
""" Hash table which uses strings for keys. Value can be any object.
9+
10+
Example usage:
11+
12+
ht = HashTable(10)
13+
ht.set('a', 1).set('b', 2).set('c', 3)
14+
ht['c'] = 30
15+
16+
"""
917

1018
def __init__(self, capacity=1000):
1119
""" Capacity defaults to 1000. """
1220

1321
self.capacity = capacity
1422
self.size = 0
23+
self._keys = []
1524
# Storage format: [ [ [key1, value], [key2, value] ], [ [key3, value] ] ]
1625
# The outmost list is the one which the hash function maps the index to. The next inner
1726
# Array is the list of objects in that storage cell. The 3rd level is the individual
@@ -39,6 +48,7 @@ def find_result_func(found_item, hash_table_cell):
3948
else:
4049
hash_table_cell.append([key, obj])
4150
self.size += 1
51+
self._keys.append(key)
4252

4353
self._find_by_key(key, find_result_func)
4454
return self
@@ -61,14 +71,33 @@ def remove(self, key):
6171
def find_result_func(found_item, hash_table_cell):
6272
if found_item:
6373
hash_table_cell.remove(found_item)
74+
self._keys.remove(key)
6475
self.size -= 1
6576
return found_item[1]
6677
else:
6778
raise KeyError(key)
6879

6980
return self._find_by_key(key, find_result_func)
7081

82+
####### Python's dict interface
83+
84+
def keys(self):
85+
return self._keys
86+
87+
def __setitem__(self, key, value):
88+
self.set(key, value)
89+
90+
def __getitem__(self, key):
91+
return self.get(key)
92+
93+
def __delitem__(self, key):
94+
return self.remove(key)
95+
96+
def __repr__(self):
97+
return '{ ' + ', '.join([key + ':' + str(self.get(key)) for key in self._keys]) + ' }'
98+
7199
if __name__ == "__main__":
100+
# Run unit tests
72101
import unittest
73102
testsuite = unittest.TestLoader().discover('test', pattern="*hashtable*")
74103
unittest.TextTestRunner(verbosity=1).run(testsuite)

test/test_hashtable.py

+14
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,20 @@ def testRemove(self):
7171
self.assertEqual(removed_item, 1)
7272
self.assertEqual(ht.size, 0)
7373

74+
def testPythonDictInterface(self):
75+
ht = hashtable.HashTable(10)
76+
77+
ht['a'] = 10
78+
self.assertEqual(ht.get('a'), 10)
79+
80+
ht['a'] = 20
81+
self.assertEqual(ht['a'], 20)
82+
83+
self.assertIn('a', ht.keys())
84+
85+
del ht['a']
86+
self.assertRaises(KeyError, ht.get, 'a')
87+
7488
if __name__ == '__main__':
7589
unittest.main()
7690

0 commit comments

Comments
 (0)