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抓取网页图片示例(python爬虫)
Apr 27 Python
python远程调用rpc模块xmlrpclib的方法
Jan 11 Python
python 处理telnet返回的More,以及get想要的那个参数方法
Feb 14 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
Jun 18 Python
用pyqt5 给按钮设置图标和css样式的方法
Jun 24 Python
python读出当前时间精度到秒的代码
Jul 05 Python
python 绘制拟合曲线并加指定点标识的实现
Jul 10 Python
Python使用matplotlib绘制三维参数曲线操作示例
Sep 10 Python
基于Python解密仿射密码
Oct 21 Python
python——全排列数的生成方式
Feb 26 Python
解决jupyter notebook 出现In[*]的问题
Apr 13 Python
Selenium 安装和简单使用的实现
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 已经成熟
2006/12/04 PHP
用PHP调用Oracle存储过程的方法
2008/09/12 PHP
PHP生成Flash动画的实现代码
2010/03/12 PHP
php下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
thinkphp配置连接数据库技巧
2014/12/02 PHP
PHP+Apache+Mysql环境搭建教程
2016/08/01 PHP
PHP入门教程之图像处理技巧分析
2016/09/11 PHP
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
左右悬浮可分组的网站QQ在线客服代码(可谓经典)
2012/12/21 Javascript
JavaScript实现SHA-1加密算法的方法
2015/03/11 Javascript
JS设置网页图片vspace和hspace属性的方法
2015/04/01 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
2016/08/26 Javascript
微信小程序 实战程序简易新闻的制作
2017/01/09 Javascript
js实现漫天星星效果
2017/01/19 Javascript
详解javascript立即执行函数表达式IIFE
2017/02/13 Javascript
详解Angular.js数据绑定时自动转义html标签及内容
2017/03/30 Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
2017/09/18 Javascript
mpvue小程序仿qq左滑置顶删除组件
2018/08/03 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
[01:16:01]VGJ.S vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Django admin美化插件suit使用示例
2017/12/12 Python
python opencv之分水岭算法示例
2018/02/24 Python
python实现手机销售管理系统
2019/03/19 Python
pandas的排序和排名的具体使用
2019/07/31 Python
python自动化测试之异常及日志操作实例分析
2019/11/09 Python
Smallable意大利家庭概念店:设计师童装及家居装饰
2018/01/08 全球购物
编辑个人求职信范文
2013/09/21 职场文书
大学生就业自我推荐信
2014/05/10 职场文书
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
英文道歉信
2015/01/20 职场文书
打架检讨书
2015/01/27 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
浅谈Mysql多表连接查询的执行细节
2021/04/24 MySQL
Python使用mitmproxy工具监控手机 下载手机小视频
2022/04/18 Python