Python中使用bidict模块双向字典结构的奇技淫巧
快速入门
模块提供三个类来处理一对一映射类型的一些操作
'bidict','inverted','namedbidict'
>>>importbidict >>>dir(bidict) ['MutableMapping','_LEGALNAMEPAT','_LEGALNAMERE','__builtins__','__doc__','__file__','__name__','__package__','bidict','inverted','namedbidict','re','wraps']
1.bidict类:
>>>frombidictimportbidict >>>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' >>>delfamous.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逆映射字典。
>>>importbidict >>>frombidictimportbidict >>>husbands2wives=bidict({'john':'jackie'}) >>>~husbands2wives bidict({'jackie':'john'})
以下情况注意添加括号,因为~的优先级低于中括号:
>>>importbidict >>>frombidictimportbidict >>>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}) >>>[keyforkeyinbi]#calls__iter__,returnskeyslikedict ['three'] >>>'three'inbi#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=lambdax:x[1]) [('three',3),('four',4),('five',5),('six',6),('seven',7)]