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实现的阳历转阴历(农历)算法
Apr 25 Python
处理Python中的URLError异常的方法
Apr 30 Python
Python中index()和seek()的用法(详解)
Apr 27 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
Aug 30 Python
python机器学习之决策树分类详解
Dec 20 Python
详解python函数传参是传值还是传引用
Jan 16 Python
对dataframe进行列相加,行相加的实例
Jun 08 Python
对pandas中两种数据类型Series和DataFrame的区别详解
Nov 12 Python
python把ipynb文件转换成pdf文件过程详解
Jul 09 Python
Python爬虫headers处理及网络超时问题解决方案
Jun 19 Python
Python3中的tuple函数知识点讲解
Jan 03 Python
Python查找算法的实现 (线性、二分,分块、插值查找算法)
Apr 24 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
twig里使用js变量的方法
2016/02/05 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
在javascript将NodeList作为Array数组处理的方法
2010/07/09 Javascript
让ie6也支持websocket采用flash封装实现
2013/02/18 Javascript
javascript正则表达式基础知识入门
2015/04/20 Javascript
使用JavaScript的AngularJS库编写hello world的方法
2015/06/23 Javascript
实例详解JavaScript获取链接参数的方法
2016/01/01 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
webpack构建的详细流程探底
2018/01/08 Javascript
react 创建单例组件的方法
2018/04/26 Javascript
vue-quill-editor富文本编辑器简单使用方法
2018/09/21 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
2019/04/29 Javascript
在NodeJs中使用node-schedule增加定时器任务的方法
2020/06/08 NodeJs
Python通过poll实现异步IO的方法
2015/06/04 Python
Zabbix实现微信报警功能
2016/10/09 Python
Python实现mysql数据库更新表数据接口的功能
2017/11/19 Python
Django 创建/删除用户的示例代码
2019/07/24 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
Python OpenCV读取显示视频的方法示例
2020/02/20 Python
HTML5到底会有什么发展?HTML5的前景展望
2015/07/07 HTML / CSS
iframe与window.onload如何使用详解
2020/05/07 HTML / CSS
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
有机婴儿毛毯和衣服:Monica + Andy
2020/03/01 全球购物
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
授权委托书样本
2014/04/03 职场文书
考察现实表现材料
2014/05/19 职场文书
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
初中生旷课检讨书范文
2014/10/06 职场文书
《1942》观后感
2015/06/08 职场文书
哈姆雷特读书笔记
2015/06/29 职场文书
职业生涯规划书之大学四年
2019/08/07 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL
一文搞懂redux在react中的初步用法
2021/06/09 Javascript
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL