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创建XML文档
Mar 01 Python
python生成随机验证码(中文验证码)示例
Apr 03 Python
pygame学习笔记(5):游戏精灵
Apr 15 Python
python获取当前运行函数名称的方法实例代码
Apr 06 Python
python交互式图形编程实例(一)
Nov 17 Python
Python爬虫基础之XPath语法与lxml库的用法详解
Sep 13 Python
python实现在函数图像上添加文字和标注的方法
Jul 08 Python
Django发送邮件和itsdangerous模块的配合使用解析
Aug 10 Python
djano一对一、多对多、分页实例代码
Aug 16 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
Mar 06 Python
Python 如何在字符串中插入变量
Aug 01 Python
使用Python通过oBIX协议访问Niagara数据的示例
Dec 04 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中利用XML技术构造远程服务(下)
2006/10/09 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
jQuery 学习6 操纵元素显示效果的函数
2010/02/07 Javascript
锋利的jQuery jQuery中的DOM操作
2010/03/21 Javascript
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
取得元素的左和上偏移量的方法
2014/09/17 Javascript
jquery实现清新实用的网页菜单效果
2015/08/28 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
2016/04/20 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
微信小程序 生命周期详解
2016/10/12 Javascript
layer弹出层中H5播放器全屏出错的解决方法
2017/02/21 Javascript
jQuery实现监听下拉框选中内容发生改变操作示例
2018/07/13 jQuery
Bootstrap实现省市区三级联动(亲测可用)
2019/07/26 Javascript
Element Breadcrumb 面包屑的使用方法
2020/07/26 Javascript
基于javascript的无缝滚动动画1
2020/08/07 Javascript
原生js实现九宫格拖拽换位
2021/01/26 Javascript
python实现从ftp服务器下载文件的方法
2015/04/30 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
基于canvas的骨骼动画的示例代码
2018/06/12 HTML / CSS
美国知名的在线旅游服务网站:Priceline
2016/07/23 全球购物
PurCotton全棉时代官网:100%天然棉花生产的生活护理用品
2016/11/18 全球购物
为娇小女性量身打造:Petite Studio
2018/11/01 全球购物
ORACLE十问
2015/04/20 面试题
自我介绍演讲稿
2014/01/15 职场文书
政风行风评议工作总结
2014/10/21 职场文书
个人四风问题整改措施
2014/10/24 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
2016年心理学教育培训学习心得体会
2016/01/12 职场文书
创业项目(超低成本创业项目)
2019/08/16 职场文书
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
2021/05/21 Python
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技