首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何实现高效的双向哈希表?

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

Stack Overflow用户
提问于 2010-07-23 21:38:21
回答 2查看 45.7K关注 0票数 104

Python dict是一个非常有用的数据结构:

代码语言:javascript
复制
d = {'a': 1, 'b': 2}

d['a'] # get 1

有时,您还希望通过值进行索引。

代码语言:javascript
复制
d[1] # get 'a'

实现这种数据结构的最有效方法是什么?有什么官方推荐的方法吗?

EN

回答 2

Stack Overflow用户

发布于 2015-12-25 13:12:17

下面的代码片段实现了一个可逆(双射)映射:

代码语言:javascript
复制
class BijectionError(Exception):
    """Must set a unique value in a BijectiveMap."""

    def __init__(self, value):
        self.value = value
        msg = 'The value "{}" is already in the mapping.'
        super().__init__(msg.format(value))


class BijectiveMap(dict):
    """Invertible map."""

    def __init__(self, inverse=None):
        if inverse is None:
            inverse = self.__class__(inverse=self)
        self.inverse = inverse

    def __setitem__(self, key, value):
        if value in self.inverse:
            raise BijectionError(value)

        self.inverse._set_item(value, key)
        self._set_item(key, value)

    def __delitem__(self, key):
        self.inverse._del_item(self[key])
        self._del_item(key)

    def _del_item(self, key):
        super().__delitem__(key)

    def _set_item(self, key, value):
        super().__setitem__(key, value)

这种实现的优点是BijectiveMapinverse属性也是一个BijectiveMap。因此,您可以执行以下操作:

代码语言:javascript
复制
>>> foo = BijectiveMap()
>>> foo['steve'] = 42
>>> foo.inverse
{42: 'steve'}
>>> foo.inverse.inverse
{'steve': 42}
>>> foo.inverse.inverse is foo
True
票数 6
EN

Stack Overflow用户

发布于 2021-10-23 20:33:42

更好的方法是将字典转换为元组列表,然后根据特定的元组字段进行排序

代码语言:javascript
复制
def convert_to_list(dictionary):
    list_of_tuples = []
    for key, value in dictionary.items():
        list_of_tuples.append((key, value))
    return list_of_tuples

def sort_list(list_of_tuples, field):
     return sorted(list_of_tuples, key=lambda x: x[field])

dictionary = {'a': 9, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
list_of_tuples = convert_to_list(dictionary)
print(sort_list(list_of_tuples, 1))

输出

代码语言:javascript
复制
[('b', 2), ('c', 3), ('d', 4), ('e', 5), ('a', 9)]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3318625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档