本文实例讲述了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