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)]