为了账号安全,请及时绑定邮箱和手机立即绑定

双向/反向映射

双向/反向映射

温温酱 2019-10-09 15:36:24
我正在python中进行此总机操作,我需要跟踪谁在跟谁说话,所以如果Alice-> Bob,则意味着Bob-> Alice。是的,我可以填充两个哈希图,但是我想知道是否有人想使用一个哈希图。或建议其他数据结构。没有多个对话。假设这是用于客户服务呼叫中心的,所以当爱丽丝拨入总机时,她仅会与鲍勃交谈。他的答复也只发给她。
查看完整描述

3 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

您可以通过子类化dict并添加所需的逻辑来创建自己的字典类型。这是一个基本示例:


class TwoWayDict(dict):

    def __setitem__(self, key, value):

        # Remove any previous connections with these values

        if key in self:

            del self[key]

        if value in self:

            del self[value]

        dict.__setitem__(self, key, value)

        dict.__setitem__(self, value, key)


    def __delitem__(self, key):

        dict.__delitem__(self, self[key])

        dict.__delitem__(self, key)


    def __len__(self):

        """Returns the number of connections"""

        return dict.__len__(self) // 2

它的工作原理如下:


>>> d = TwoWayDict()

>>> d['foo'] = 'bar'

>>> d['foo']

'bar'

>>> d['bar']

'foo'

>>> len(d)

1

>>> del d['foo']

>>> d['bar']

Traceback (most recent call last):

  File "<stdin>", line 7, in <module>

KeyError: 'bar'

我确定我没有涵盖所有情况,但这应该可以帮助您入门。


查看完整回答
反对 回复 2019-10-09
?
九州编程

TA贡献1785条经验 获得超4个赞

在特殊情况下,您可以将两者都存储在一个字典中:


relation = {}

relation['Alice'] = 'Bob'

relation['Bob'] = 'Alice'

由于您要描述的是对称关系。 A -> B => B -> A


查看完整回答
反对 回复 2019-10-09
?
手掌心

TA贡献1942条经验 获得超3个赞

我知道这是一个比较老的问题,但是我想提一个解决这个问题的另一个好方法,就是python软件包bidict。使用起来非常简单:


from bidict import bidict

map = bidict(Bob = "Alice")

print(map["Bob"])

print(map.inv["Alice"])


查看完整回答
反对 回复 2019-10-09
  • 3 回答
  • 0 关注
  • 495 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信