map,不完全是字典
map的本意是映射,一个key-value对的映射。
字典属于其中的一个,但平常见得多的主要还是字典,所以下面就直接上字典了。
这里的话,我们是先提供了一个基本的结点,包含了key、value,然后重构了等于、不等于运算符(注意等于不等于运算符的内容是不同的,一个是key,一个是整体)等,主要的结构还是基于列表。
其实字典最香的还是哈希实现的O(1)查找,列表做不到,但是实现一下加深理解,下一篇我们来一个哈希。
from collections import MutableMapping
class MapBase(MutableMapping):
"""lightweight composite to store key-value pairs as map items"""
class _Item():
__slots__ = '_key', '_value'
def __init__(self,k,v):
self._key = k
self._value = v
def __eq__(self,other):
return self._key == other._key
def __ne__(self,other):
return not(self==other)
def __lt__(self,other):
return self._key < other._key
# 一个未排序列表实现的map
class UnsortedTableMap(MapBase):
"""map implementation using an unordered list"""
def __init__(self):
"""create an empty map"""
self._table = []
def __getitem__(self,k):
"""return value associated with key k"""
for item in self._table:
if k == item._key:
return item._value
raise KeyError('KeyError:'+repr(k))
def __setitem__(self, k, v):
"""assign value v to key k, overwriting existing value if present"""
for item in self._table:
if k == item._key:
item._value = v
return
# did not find
self._table.append(self._Item(k,v))
def __delitem__(self,k):
"""remove item associated with key"""
for j in range(len(self._table)):
if k == self._table[j]._key:
self._table.pop(j)
return KeyError('KeyError: '+repr(k))
def __len__(self):
"""return number of items in the map"""
return len(self._table)
def __iter__(self):
"""generate iteration of the map's keys"""
for item in self._table:
yield item._key