Python中使用bidict模块双向字典结构的奇技淫巧
admin
2023-08-01 19:12:05
0

快速入门

模块提供三个类来处理一对一映射类型的一些操作
\’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)]

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...