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 相关文章推荐
详谈Python2.6和Python3.0中对除法操作的异同
Apr 28 Python
Python简单实现自动删除目录下空文件夹的方法
Aug 29 Python
Python3实现发送QQ邮件功能(附件)
Dec 23 Python
Python实现读取及写入csv文件的方法示例
Jan 12 Python
python 删除列表里所有空格项的方法总结
Apr 18 Python
pandas数据清洗,排序,索引设置,数据选取方法
May 18 Python
Python之列表的插入&替换修改方法
Jun 28 Python
python format 格式化输出方法
Jul 16 Python
Django框架序列化与反序列化操作详解
Nov 01 Python
flask框架配置mysql数据库操作详解
Nov 29 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
Apr 10 Python
Python接口测试结果集实现封装比较
May 01 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
phpinfo 系统查看参数函数代码
2009/06/05 PHP
php UBB 解析实现代码
2011/11/27 PHP
yii实现图片上传及缩略图生成的方法
2014/12/04 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
2015/06/23 PHP
PHP实现的进度条效果详解
2016/05/03 PHP
CI框架中$this->load->library()用法分析
2016/05/18 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
详解PHP文件的自动加载(autoloading)
2018/02/04 PHP
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
基于javascript实现泡泡大冒险网页版小游戏
2016/03/23 Javascript
JavaScript中对象的不同创建方法
2016/08/12 Javascript
简单实现js浮动框
2016/12/13 Javascript
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
JavaScript实现焦点进入文本框内关闭输入法的核心代码
2017/09/20 Javascript
使用Angular CLI生成 Angular 5项目教程详解
2018/03/18 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
[02:48]DOTA2超级联赛专访海涛:你们的选择没有错
2013/06/07 DOTA
python写入中英文字符串到文件的方法
2015/05/06 Python
全面解析Python的While循环语句的使用方法
2015/10/13 Python
python字符串中的单双引
2017/02/16 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
2018/03/14 Python
python 检查文件mime类型的方法
2018/12/08 Python
python读取txt文件并取其某一列数据的示例
2019/02/19 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
Python request操作步骤及代码实例
2020/04/13 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
CSS3 选择器 基本选择器介绍
2012/01/21 HTML / CSS
俄罗斯宠物用品网上商店:ZooMag
2019/12/12 全球购物
便利店投资的创业计划书
2014/01/12 职场文书
公司聘任书模板
2014/03/29 职场文书
计生工作先进事迹
2014/08/15 职场文书
教师民族团结演讲稿
2014/08/27 职场文书
拾金不昧表扬信
2015/01/16 职场文书