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网络编程之文件下载实例分析
May 20 Python
使用Python对Access读写操作
Mar 30 Python
TensorFlow如何实现反向传播
Feb 06 Python
pygame游戏之旅 添加icon和bgm音效的方法
Nov 21 Python
详解pandas数据合并与重塑(pd.concat篇)
Jul 09 Python
用Python配平化学方程式的方法
Jul 20 Python
pycharm运行程序时看不到任何结果显示的解决
Feb 21 Python
Django查询优化及ajax编码格式原理解析
Mar 25 Python
Python多进程编程常用方法解析
Mar 26 Python
python 异步async库的使用说明
May 04 Python
python和opencv构建运动检测器的实现
Mar 03 Python
将Python代码打包成.exe可执行文件的完整步骤
May 12 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
php Calender(日历)代码分享
2014/01/03 PHP
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
Laravel 5框架学习之向视图传送数据
2015/04/08 PHP
PHP实现即时输出、实时输出内容方法
2015/05/27 PHP
PHP 常用的header头部定义汇总
2015/06/19 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
浅谈php://filter的妙用
2019/03/05 PHP
jMessageBox 基于jQuery的窗口插件
2009/12/09 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
javascript中的throttle和debounce浅析
2014/06/06 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
2014/12/14 Javascript
jquery编写Tab选项卡滚动导航切换特效
2020/07/17 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
Javascript 函数的四种调用模式
2016/11/05 Javascript
jQuery 获取select选中值及清除选中状态
2016/12/13 Javascript
Javascript计算二维数组重复值示例代码
2016/12/18 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
Vue在 Nuxt.js 中重定向 404 页面的方法
2019/04/23 Javascript
jquery实现的放大镜效果示例
2020/02/24 jQuery
Vue+elementUI实现多图片上传与回显功能(含回显后继续上传或删除)
2020/03/23 Javascript
JavaScript实现下拉列表
2021/01/20 Javascript
Python实现把json格式转换成文本或sql文件
2015/07/10 Python
python3实现逐字输出的方法
2019/01/23 Python
Django的ListView超详细用法(含分页paginate)
2020/05/21 Python
Django mysqlclient安装和使用详解
2020/09/17 Python
Python读写csv文件流程及异常解决
2020/10/20 Python
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
物业客服专员岗位职责
2013/11/30 职场文书
上班早退检讨书
2014/01/09 职场文书
普通员工辞职信
2014/01/17 职场文书
七夕情人节促销方案
2014/06/07 职场文书
物业管理专业自荐信
2014/07/01 职场文书
党支部班子“四风”问题自我剖析材料
2014/09/28 职场文书
用电申请报告范文
2015/05/18 职场文书
PyCharm 安装与使用配置教程(windows,mac通用)
2021/05/12 Python