其他分享
首页 > 其他分享> > 如何实现高效的双向哈希表?

如何实现高效的双向哈希表?

作者:互联网

参见英文答案 > Two way/reverse map                                    13个
Python dict是一个非常有用的数据结构:

d = {'a': 1, 'b': 2}

d['a'] # get 1

有时你也想按值索引.

d[1] # get 'a'

哪种方法是实现此数据结构的最有效方法?有官方推荐的方法吗?

解决方法:

这是一个双向字典的类,受到Finding key from value in Python dictionary的启发并修改为允许以下2)和3).

注意 :

> 1)当修改标准字典bd时,逆目录bd.inverse自动更新.
> 2)逆目录bd.inverse [value]始终是键列表,使得bd [key] == value.
> 3)与https://pypi.python.org/pypi/bidict的bidict模块不同,这里我们可以有2个具有相同值的键,这一点非常重要.

码:

class bidict(dict):
    def __init__(self, *args, **kwargs):
        super(bidict, self).__init__(*args, **kwargs)
        self.inverse = {}
        for key, value in self.items():
            self.inverse.setdefault(value,[]).append(key) 

    def __setitem__(self, key, value):
        if key in self:
            self.inverse[self[key]].remove(key) 
        super(bidict, self).__setitem__(key, value)
        self.inverse.setdefault(value,[]).append(key)        

    def __delitem__(self, key):
        self.inverse.setdefault(self[key],[]).remove(key)
        if self[key] in self.inverse and not self.inverse[self[key]]: 
            del self.inverse[self[key]]
        super(bidict, self).__delitem__(key)

用法示例:

bd = bidict({'a': 1, 'b': 2})  
print(bd)                     # {'a': 1, 'b': 2}                 
print(bd.inverse)             # {1: ['a'], 2: ['b']}
bd['c'] = 1                   # Now two keys have the same value (= 1)
print(bd)                     # {'a': 1, 'c': 1, 'b': 2}
print(bd.inverse)             # {1: ['a', 'c'], 2: ['b']}
del bd['c']
print(bd)                     # {'a': 1, 'b': 2}
print(bd.inverse)             # {1: ['a'], 2: ['b']}
del bd['a']
print(bd)                     # {'b': 2}
print(bd.inverse)             # {2: ['b']}
bd['b'] = 3
print(bd)                     # {'b': 3}
print(bd.inverse)             # {2: [], 3: ['b']}

标签:python,hashtable,bidirectional
来源: https://codeday.me/bug/20190915/1805959.html