Python中使用bidict模块双向字典结构的奇技淫巧


Posted in Python onJuly 12, 2016

快速入门

模块提供三个类来处理一对一映射类型的一些操作
'bidict', 'inverted', 'namedbidict'

>>> import bidict
>>> dir(bidict)
['MutableMapping', '_LEGALNAMEPAT', '_LEGALNAMERE', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'bidict', 'inverted', 'namedbidict', 're', 'wraps']

1.bidict类: 

>>> from bidict import bidict
>>> D=bidict({'a':'b'})
>>> D['a']
'b'
>>> D[:'b']
'a'
>>> ~D        #反转字典
bidict({'b': 'a'})
>>> dict(D)    #转为普通字典
{'a': 'b'}
>>> D['c']='c'   #添加元素,普通字典的方法都可以用
>>> D
bidict({'a': 'b', 'c': 'c'})

2.inverted类,反转字典的键值

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

3.namedbidict(mapname, fwdname, invname):

>>> CoupleMap = namedbidict('CoupleMap', 'husbands', 'wives')
>>> famous = CoupleMap({'bill': 'hillary'})
>>> famous.husbands['bill']
'hillary'
>>> famous.wives['hillary']
'bill'
>>> famous.husbands['barack'] = 'michelle'
>>> del famous.wives['hillary']
>>> famous
CoupleMap({'barack': 'michelle'})

更多内容

如果你不喜欢冒号的方式,可以使用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逆映射字典。

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

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

>>> import bidict
>>> from bidict import bidict
>>> husbands2wives = bidict({'john': 'jackie'})
>>> ~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)]

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 key in bi] # calls __iter__, returns keys like dict
['three']
>>> 'three' in bi # 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)]
Python 相关文章推荐
python函数参数*args**kwargs用法实例
Dec 04 Python
跟老齐学Python之有容乃大的list(3)
Sep 15 Python
Python动态导入模块的方法实例分析
Jun 28 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
Jan 30 Python
python实现nao机器人手臂动作控制
Apr 29 Python
深入学习python多线程与GIL
Aug 26 Python
Python中BeautifuSoup库的用法使用详解
Nov 15 Python
OpenCV 表盘指针自动读数的示例代码
Apr 10 Python
pandas 像SQL一样使用WHERE IN查询条件说明
Jun 05 Python
python在一个范围内取随机数的简单实例
Aug 16 Python
PyTorch安装与基本使用详解
Aug 31 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
Feb 02 Python
Python使用SocketServer模块编写基本服务器程序的教程
Jul 12 #Python
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
Jul 12 #Python
Python的Flask框架标配模板引擎Jinja2的使用教程
Jul 12 #Python
深度定制Python的Flask框架开发环境的一些技巧总结
Jul 12 #Python
Python的面向对象编程方式学习笔记
Jul 12 #Python
Python使用cookielib模块操作cookie的实例教程
Jul 12 #Python
Python网络编程中urllib2模块的用法总结
Jul 12 #Python
You might like
配置支持SSI
2006/11/25 PHP
PHP开发的一些注意点总结
2010/10/12 PHP
php分页函数示例代码分享
2014/02/24 PHP
thinkphp实现图片上传功能分享
2014/03/04 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
php探针不显示内存解决方法
2019/09/17 PHP
javascript 动态添加事件代码
2008/11/30 Javascript
JS getMonth()日期函数的值域是0-11
2010/02/15 Javascript
javascript中打印当前的时间实现思路及代码
2013/12/18 Javascript
Jquery中"$(document).ready(function(){ })"函数的使用详解
2013/12/30 Javascript
js实现鼠标触发图片抖动效果的方法
2015/02/27 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
2015/11/29 Javascript
JQuery点击事件回到页面顶部效果的实现代码
2016/05/24 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
video.js 实现视频只能后退不能快进的思路详解
2018/08/09 Javascript
JavaScript设计模式之代理模式实例分析
2019/01/16 Javascript
js验证密码强度解析
2020/03/18 Javascript
Vue时间轴 vue-light-timeline的用法说明
2020/10/29 Javascript
[11:44]Ti9 OG夺冠时刻
2019/08/25 DOTA
wxpython中利用线程防止假死的实现方法
2014/08/11 Python
python编程开发之日期操作实例分析
2015/11/13 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
2017/11/03 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
2020/02/17 Python
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
法国高保真音响和家庭影院商店:Son Video
2019/04/26 全球购物
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
园长自我鉴定
2013/10/06 职场文书
大学生找工作推荐信范文
2013/11/28 职场文书
投资合作协议书
2014/04/17 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
思想作风整顿个人剖析材料
2014/10/06 职场文书
个人年终总结结尾
2015/03/06 职场文书
护士长2015年终工作总结
2015/04/24 职场文书
毕业赠语大全
2015/06/23 职场文书
获奖感言范文
2015/07/31 职场文书