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