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 实现堆排序算法代码
Jun 05 Python
python3基于OpenCV实现证件照背景替换
Jul 18 Python
用Python抢火车票的简单小程序实现解析
Aug 14 Python
django和vue实现数据交互的方法
Aug 21 Python
详解pyinstaller selenium python3 chrome打包问题
Oct 18 Python
Python Des加密解密如何实现软件注册码机器码
Jan 08 Python
python 非线性规划方式(scipy.optimize.minimize)
Feb 11 Python
获取python运行输出的数据并解析存为dataFrame实例
Jul 07 Python
Python绘图之柱形图绘制详解
Jul 28 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
Jan 06 Python
Pytest allure 命令行参数的使用
Apr 18 Python
浅谈Python数学建模之整数规划
Jun 23 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
在windows iis5下安装php4.0+mysql之我见
2006/10/09 PHP
php检测图片木马多进制编程实践
2013/04/11 PHP
php实现遍历多维数组的方法
2015/11/25 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
PHP文件下载实例代码浅析
2016/08/17 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
php 判断IP为有效IP地址的方法
2018/01/28 PHP
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
javascript 学习笔记(六)浏览器类型及版本信息检测代码
2011/04/08 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
bootstrap data与jquery .data
2014/07/07 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
2014/12/20 Javascript
JavaScript如何自定义trim方法
2015/07/28 Javascript
php利用curl获取远程图片实现方法
2015/10/26 Javascript
全面解析Javascript无限添加QQ好友原理
2016/06/15 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
2016/08/10 Javascript
在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程
2018/03/21 Javascript
详解webpack2异步加载套路
2018/09/14 Javascript
vue父组件触发事件改变子组件的值的方法实例详解
2019/05/07 Javascript
vue百度地图 + 定位的详解
2019/05/13 Javascript
总结python实现父类调用两种方法的不同
2017/01/15 Python
python基础教程项目五之虚拟茶话会
2018/04/02 Python
Python弹出输入框并获取输入值的实例
2019/06/18 Python
Python笔记之代理模式
2019/11/20 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
2020/02/26 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
设计师家具购买和委托在线市场:Viyet
2016/11/16 全球购物
New Balance波兰官方商城:始于1906年,百年慢跑品牌
2017/08/15 全球购物
英国比较机场停车场网站:Airport Parking Essentials
2019/12/01 全球购物
thinkphp5 redis缓存新增方法实例讲解
2021/03/24 PHP
档案保密承诺书
2014/06/03 职场文书
企业安全生产标语
2014/06/06 职场文书
党性教育心得体会
2014/09/03 职场文书
事业单位年度考核评语
2014/12/31 职场文书
初中班长竞选稿
2015/11/20 职场文书