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