本文实例讲述了Python在字典中将键映射到多个值上的方法。分享给大家供大家参考,具体如下:
问题:一个能将键(key)映射到多个值的字典(即所谓的一键多值字典[multidict])
解决方案:如果想让键映射到多值,需要将这多个值保持到另一个容器如列表或集合中;
1
2
3
4
5
6
7
8
9
10
|
>>> d = { 'a' :[ 1 , 2 , 3 ], 'b' :[ 4 , 5 ]}
>>> d
{ 'b' : [ 4 , 5 ], 'a' : [ 1 , 2 , 3 ]}
>>> e = { 'a' :{ 1 , 2 , 3 , 3 }, 'b' :{ 4 , 5 }}
>>> e
{ 'b' : { 4 , 5 }, 'a' : { 1 , 2 , 3 }}
>>> f = { 'a' :[ 1 , 2 , 3 , 3 ], 'b' :[ 4 , 5 ]}
>>> f
{ 'b' : [ 4 , 5 ], 'a' : [ 1 , 2 , 3 , 3 ]}
>>>
|
更方便的创建这样的字典是利用collections模块中的defaultdict类。defaultdict的一个特点是它会自动给字典初始化第一个值,这样只需添加元素即可。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
from collections import defaultdict
d = defaultdict( list ) #创建一键多值的字典,key的value是list类型
d[ 'a' ].append( 1 )
d[ 'a' ].append( 2 )
d[ 'a' ].append( 2 )
d[ 'b' ].append( 4 )
c = defaultdict( set ) #创建一键多值的字典,key的value是set类型
c[ 'a' ].add( 1 )
c[ 'a' ].add( 2 )
c[ 'a' ].add( 2 )
c[ 'b' ].add( 4 )
print ( 'key的value是list类型的字典:' ,d)
print ( 'key的value是set类型的字典:' ,c)
|
1
2
3
4
5
|
>>> = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = RESTART = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
>>>
key的value是 list 类型的字典: defaultdict(< class 'list' >, { 'b' : [ 4 ], 'a' : [ 1 , 2 , 2 ]})
key的value是 set 类型的字典: defaultdict(< class 'set' >, { 'b' : { 4 }, 'a' : { 1 , 2 }})
>>>
|
关于defaultdict需要注意的一点,他会自动创建字典表项以待稍后的访问(即使这些表项当前在字典中还没有找到)。
如果想取消这个功能,可以在普通的字典上调用setdefault()
方法来取代,例如:
1
2
3
4
5
6
|
d = {} #一个普通的字典
d.setdefault( 'a' ,[]).append( 1 )
d.setdefault( 'a' ,[]).append( 2 )
d.setdefault( 'a' ,[]).append( 2 )
d.setdefault( 'b' ,[]).append( 4 )
>>>
|
key的value是list类型的字典:
1
|
{ 'a' : [ 1 , 2 , 2 ], 'b' : [ 4 ]}
|
补充:
构建一个一键多值的字典很容易,但是如果试着自己对第一个值做初始化操作,这个会变得很杂乱,如果使用defaultdic后代码会简洁很多:
1
2
3
4
5
6
7
8
|
pairs = { 'a' :[ 22 , 44 ], 'b' :[ 88 ]}
d = defaultdict( list )
for key,value in pairs.items():
d[key].append(value)
print (d)
>>>
defaultdict(< class 'list' >, { 'a' : [[ 22 , 44 ]], 'b' : [[ 88 ]]})
>>>
|
(代码摘自《Python Cookbook》)
希望本文所述对大家Python程序设计有所帮助。
原文链接:http://www.cnblogs.com/apple2016/p/5744799.html