码迷,mamicode.com
首页 > 编程语言 > 详细

【python cookbook】【数据结构与算法】6.在字典中将键映射到多个值上

时间:2016-08-06 21:47:47      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

问题:一个能将键(key)映射到多个值的字典(即所谓的一键多值字典[multidict])

解决方案:如果想让键映射到多值,需要将这多个值保持到另一个容器如列表或集合中;

>>> 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的一个特点是它会自动给字典初始化第一个值,这样只需添加元素即可。例如:

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)
>>> ================================ 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()方法来取代,例如:

d={} #一个普通的字典
d.setdefault(a,[]).append(1)
d.setdefault(a,[]).append(2)
d.setdefault(a,[]).append(2)
d.setdefault(b,[]).append(4)
>>> 
key的value是list类型的字典: {a: [1, 2, 2], b: [4]}

补充:

构建一个一键多值的字典很容易,但是如果试着自己对第一个值做初始化操作,这个会变得很杂乱,如果使用defaultdic后代码会简洁很多:

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】【数据结构与算法】6.在字典中将键映射到多个值上

标签:

原文地址:http://www.cnblogs.com/apple2016/p/5744799.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!