python模块介绍-bidict 双向字典

长平狐 发布于 2013/12/25 17:23
阅读 705
收藏 0

python模块介绍-bidict 双向字典

2013-04-20 磁针石

#承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 博客:http://blog.csdn.net/oychw

#版权所有,转载刊登请来函联系

#深圳测试自动化python项目接单群113938272深圳会计软件测试兼职6089740

#深圳地摊群66250781武冈洞口城步新宁乡情群49494279

#自动化测试和python群组:http://groups.google.com/group/automation_testing_python

#参考资料:《ThePython Standard Libraryby Example 2011》

bidict提供了一个双向映射的数据结构和相关的工具(``namedbidict``,``inverted``),以在Python中自然建模的一对关系。它对Python的切片语法有所修改,以表示逆映射。

实例:

>>> husbands2wives = bidict({'john': 'jackie'})

>>> husbands2wives['john'] # the forward mapping is just likewith dict

'jackie'

>>> husbands2wives[:'jackie'] # use slice for the inversemapping

'john'

可见在切片的前面加上冒号表示逆映射。跟数据的切片类似,husbands2wives['john']和husbands2wives['john':]的效果一样。

如果你不喜欢冒号的方式,可以使用namedbidict类给双向字典起2个别名。这样对外会提供正向和逆向的2个子字典。实际上还是以一个双向 字典的形式存在:

>>> HTMLEntities = namedbidict('HTMLEntities', 'names','codepoints')

>>> entities = HTMLEntities({'lt': 60, 'gt': 62, 'amp': 38}) #etc

>>> entities.names['lt']

60

>>> entities.codepoints[38]

'amp'

还可以使用一元的逆运算符"~"获取bidict逆映射字典。

>>> ~husbands2wives

bidict({'jackie': 'john'})

以下情况注意添加括号,因为~的优先级低于中括号:

        >>> (~bi)['one']

        1

bidict不是dict的子类,但它的API的是dict的超集(但没有fromkeys方法,改用了MutableMapping接 口)。

迭代器类inverted会翻转key和value,如:

        >>> seq = [(1,'one'), (2, 'two'), (3, 'three')]

        >>>list(inverted(seq))

        [('one', 1), ('two', 2),('three', 3)]。

inverted会首先调用对象的__inverted__方法,如果调用成功就会返回一个迭代器。如果调用失败,就会调用对象的items方法,返回方向结果对。items调用失败,直接报错误。

bidict的invert()方法和inverted类似。

依赖模块:collections中的MutableMapping,functools中的wraps,re。

bidict可以和字典进行比较。

>>> bi == bidict({1:'one'})

        >>> bi ==dict([(1, 'one')])

        True

其他字典通用的方法,bidict也支持:

 

        >>>bi.get('one')

        1

        >>>bi.setdefault('one', 2)

        1

        >>> bi.setdefault('two',2)

        2

        >>> len(bi) #calls __len__

        2

        >>>bi.pop('one')

        1

        >>> bi.popitem()

        ('two', 2)

        >>>bi.inv.setdefault(3, 'three')

        'three'

        >>> bi

        bidict({'three': 3})

        >>> [key for keyin bi] # calls __iter__, returns keys like dict

        ['three']

        >>> 'three' inbi # calls __contains__

        True

        >>>list(bi.keys())

        ['three']

        >>>list(bi.values())

        [3]

        >>> bi.update([('four',4)])

        >>>bi.update({'five': 5}, six=6, seven=7)

        >>>sorted(bi.items(), key=lambda x: x[1])

        [('three', 3), ('four',4), ('five', 5), ('six', 6), ('seven', 7)]


原文链接:http://blog.csdn.net/oychw/article/details/8828727
加载中
返回顶部
顶部