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 相关文章推荐
sqlalchemy对象转dict的示例
Apr 22 Python
Python函数返回值实例分析
Jun 08 Python
python清除指定目录内所有文件中script的方法
Jun 30 Python
Python Socket传输文件示例
Jan 16 Python
Python基础教程之内置函数locals()和globals()用法分析
Mar 16 Python
Python使用win32 COM实现Excel的写入与保存功能示例
May 03 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
Jun 01 Python
python3基于OpenCV实现证件照背景替换
Jul 18 Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 Python
python面向对象之类属性和类方法案例分析
Dec 30 Python
Python pip配置国内源的方法
Feb 14 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
Feb 15 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和数据库结合的一个简单的web实例 代码分析 (php初学者)
2011/07/28 PHP
举例详解PHP脚本的测试方法
2015/08/05 PHP
PHP弹出对话框技巧详细解读
2015/09/26 PHP
PHP版微信小店接口开发实例
2016/11/12 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
学习YUI.Ext基础第一天
2007/03/10 Javascript
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
百度留言本js 大家可以参考下
2009/10/13 Javascript
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
JS折半插入排序算法实例
2015/12/02 Javascript
jquery ztree实现模糊搜索功能
2016/02/25 Javascript
JS代码实现table数据分页效果
2016/05/26 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
使用vue.js在页面内组件监听scroll事件的方法
2018/09/11 Javascript
JS实现判断数组是否包含某个元素示例
2019/05/24 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
2020/09/21 Javascript
[01:04:31]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第二场 1月8日
2021/03/11 DOTA
python缩进区别分析
2014/02/15 Python
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
Python实现读取机器硬件信息的方法示例
2018/06/09 Python
pandas 读取各种格式文件的方法
2018/06/22 Python
Django对数据库进行添加与更新的例子
2019/07/12 Python
Python超越函数积分运算以及绘图实现代码
2019/11/20 Python
html5 localStorage本地存储_动力节点Java学院整理
2017/07/06 HTML / CSS
公务员培训自我鉴定
2014/02/01 职场文书
科级干部考察材料
2014/02/15 职场文书
希特勒的演讲稿
2014/05/23 职场文书
民主评议党员自我鉴定
2014/10/21 职场文书
干货:企业内部人才推荐奖励方案!
2019/07/09 职场文书
导游词之山东八大关
2019/12/18 职场文书
一小时学会TensorFlow2之基本操作2实例代码
2021/09/04 Python
SQL基础的查询语句
2021/11/11 MySQL
Java Spring Boot请求方式与请求映射过程分析
2022/06/25 Java/Android