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基于socket实现网络广播的方法
Apr 29 Python
Python编程中运用闭包时所需要注意的一些地方
May 02 Python
Python简单操作sqlite3的方法示例
Mar 22 Python
python生成式的send()方法(详解)
May 08 Python
详解Python循环作用域与闭包
Mar 21 Python
使用python判断jpeg图片的完整性实例
Jun 10 Python
python同步windows和linux文件
Aug 29 Python
python实现广度优先搜索过程解析
Oct 19 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
Python应用实现处理excel数据过程解析
Jun 19 Python
python字符串的index和find的区别详解
Jun 20 Python
Python开发五子棋小游戏
Apr 28 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 强制下载文件代码
2010/10/24 PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
调整PHP的性能
2013/10/30 PHP
php实现删除指定目录下相关文件的方法
2014/10/20 PHP
yii2 页面底部加载css和js的技巧
2016/04/21 PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
2018/12/18 PHP
fireworks菜单生成器mm_menu.js在 IE 7.0 显示问题的解决方法
2009/10/20 Javascript
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
javascript来定义类的规范小结
2010/11/19 Javascript
js的表单操作 简单计算器
2011/12/29 Javascript
kindeditor编辑器点中图片滚动条往上顶的bug
2015/07/05 Javascript
实例详解angularjs和ajax的结合使用
2015/10/22 Javascript
jQuery遍历DOM节点操作之filter()方法详解
2016/04/14 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
2016/10/19 Javascript
Angular 4.x 动态创建表单实例
2017/04/25 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
webpack 2.x配置reactjs基本开发环境详解
2017/08/08 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
2017/10/31 Javascript
详解使用webpack+electron+reactJs开发windows桌面应用
2019/02/01 Javascript
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
详解在vue-cli3.0中自定css、js和图片的打包路径
2019/08/26 Javascript
JS实现多功能计算器
2020/10/28 Javascript
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
PyCharm在新窗口打开项目的方法
2019/01/17 Python
Python脚本实现监听服务器的思路代码详解
2020/05/28 Python
pycharm永久激活超详细教程
2020/10/29 Python
python快速安装OpenCV的步骤记录
2021/02/22 Python
世界上最大的罕见唱片、CD和音乐纪念品网上商店:991.com
2018/05/03 全球购物
经典C++面试题一
2016/11/06 面试题
基层工作经历证明
2014/01/13 职场文书
三八红旗手先进事迹材料
2014/05/13 职场文书
高等教育学专业自荐书
2014/06/17 职场文书
2019求职信大礼包
2019/05/15 职场文书
浅谈Python协程asyncio
2021/06/20 Python
索尼ICF-36收音机评测
2022/04/30 无线电
总结三种用 Python 作为小程序后端的方式
2022/05/02 Python