快速入门
模块提供三个类来处理一对一映射类型的一些操作
'bidict', 'inverted', 'namedbidict'
1
2
3
4
|
>>> import bidict >>> dir (bidict) [ 'MutableMapping' , '_LEGALNAMEPAT' , '_LEGALNAMERE' , '__builtins__' , '__doc__' , '__file__' , '__name__' , '__package__' , 'bidict' , 'inverted' , 'namedbidict' , 're' , 'wraps' ] |
1.bidict类:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
>>> 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类,反转字典的键值
1
2
3
|
>>> seq = [( 1 , 'one' ), ( 2 , 'two' ), ( 3 , 'three' )] >>> list (inverted(seq)) [( 'one' , 1 ), ( 'two' , 2 ), ( 'three' , 3 )] |
3.namedbidict(mapname, fwdname, invname):
1
2
3
4
5
6
7
8
9
10
|
>>> 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个子字典。实际上还是以一个双向 字典的形式存在:
1
2
3
4
5
6
|
>>> HTMLEntities = namedbidict( 'HTMLEntities' , 'names' , 'codepoints' ) >>> entities = HTMLEntities({ 'lt' : 60 , 'gt' : 62 , 'amp' : 38 }) # etc >>> entities.names[ 'lt' ] 60 >>> entities.codepoints[ 38 ] 'amp' |
还可以使用一元的逆运算符"~"获取bidict逆映射字典。
1
2
3
4
5
|
>>> import bidict >>> from bidict import bidict >>> husbands2wives = bidict({ 'john' : 'jackie' }) >>> ~husbands2wives bidict({ 'jackie' : 'john' }) |
以下情况注意添加括号,因为~的优先级低于中括号:
1
2
3
4
5
|
>>> import bidict >>> from bidict import bidict >>> husbands2wives = bidict({ 'john' : 'jackie' }) >>> ~husbands2wives bidict({ 'jackie' : 'john' }) |
以下情况注意添加括号,因为~的优先级低于中括号:
1
2
|
>>> (~bi)[ 'one' ] 1 |
bidict不是dict的子类,但它的API的是dict的超集(但没有fromkeys方法,改用了MutableMapping接 口)。
迭代器类inverted会翻转key和value,如:
1
2
3
|
>>> 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可以和字典进行比较
1
2
3
|
>>> bi = = bidict({ 1 : 'one' }) >>> bi = = dict ([( 1 , 'one' )]) True |
其他字典通用的方法,bidict也支持:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
>>> 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 )] |