python&数据结构——未排序列表实现字典(map)

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值