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使用urllib模块的urlopen超时问题解决方法
Nov 08 Python
python使用webbrowser浏览指定url的方法
Apr 04 Python
Python中使用pprint函数进行格式化输出的教程
Apr 07 Python
Python实现Smtplib发送带有各种附件的邮件实例
Jun 05 Python
Python对列表中的各项进行关联详解
Aug 15 Python
浅谈pandas中shift和diff函数关系
Apr 08 Python
Python中logging实例讲解
Jan 17 Python
基于python-opencv3的图像显示和保存操作
Jun 27 Python
django删除表重建的实现方法
Aug 28 Python
python实现发送带附件的邮件代码分享
Sep 22 Python
python 下载m3u8视频的示例代码
Nov 11 Python
python基础之函数的定义和调用
Oct 24 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
基于mysql的论坛(4)
2006/10/09 PHP
phpMyAdmin下载、安装和使用入门教程
2007/05/31 PHP
PHP手机号码归属地查询代码(API接口/mysql)
2012/09/04 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
使用IE的地址栏来辅助调试Web页脚本
2007/03/08 Javascript
JavaScript国旗变换效果代码
2008/08/13 Javascript
三级下拉菜单的js实现代码
2011/05/23 Javascript
js单向链表的具体实现实例
2013/06/21 Javascript
javaScript 计算两个日期的天数相差(示例代码)
2013/12/27 Javascript
jquery实现ajax提交form表单的方法总结
2014/03/03 Javascript
JS中取二维数组中最大值的方法汇总
2016/04/17 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
2016/06/24 Javascript
Vue 进阶教程之v-model详解
2017/05/06 Javascript
JS简单实现滑动加载数据的方法示例
2017/10/18 Javascript
Parcel.js + Vue 2.x 极速零配置打包体验教程
2017/12/24 Javascript
微信小程序input框中加入小图标的实现方法
2018/06/19 Javascript
JS数组实现分类统计实例代码
2018/09/30 Javascript
微信公众平台获取access_token的方法步骤
2019/03/29 Javascript
ES6 Set结构的应用实例分析
2019/06/26 Javascript
django中使用vue.js的要点总结
2019/07/07 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
2020/09/27 Javascript
PyQt5每天必学之带有标签的复选框
2018/04/19 Python
Python递归函数实例讲解
2019/02/27 Python
Python实现的统计文章单词次数功能示例
2019/07/08 Python
有关Tensorflow梯度下降常用的优化方法分享
2020/02/04 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
Pytorch 高效使用GPU的操作
2020/06/27 Python
萌新的HTML5 入门指南
2020/11/06 HTML / CSS
澳大利亚便宜隐形眼镜购买网站:QUICKLENS Australia
2018/10/06 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
如何开发安全的AJAX应用
2014/03/26 面试题
单位考核聘任报告
2015/03/02 职场文书
同意落户证明
2015/06/19 职场文书
golang 实现两个结构体复制字段
2021/04/28 Golang
Windows Server 修改远程桌面端口的实现
2022/06/25 Servers