python 实现二维字典的键值合并等函数
这篇文章主要讲python中关于字典的一些具体操作,讲解的问题都是本人在实际编程中所遇到的问题,读者可以根据自己所遇到的问题具体问题具体分析。
(1)二维字典的键值合并:
先提供一个应用场景:
假设我有两个二维字典:
room1={orderid1:{roomid1:pred1,roomid2:pred2},orderid2:{roomid3:pred3,roomid4:pred4}}
room2={orderid1:{roomid1:pred5,roomid2:pred6},orderid2:{roomid3:pred7,roomid4:pred8}}
这两个字典的key相同,只有第二维的value不同,我的目的是把这两个字典的value相加,得到的结果如下:
sum_room={orderid1:{roomid1:pred1+pred5,roomid2:pred2+pred6},orderid2:{roomid3:pred3+pred7,roomid4:pred4+pred8}}
具体的实现代码如下:(为了提高通用性,以下代码创建了两个简单的字典obj3,obj4)
实现二维字典的键值合并,即将同个key下的value相加:
思路:先创建一个空字典all_room,将all_room与obj的value相加并赋给all_room:
fromcollectionsimportdefaultdict
all_room=defaultdict(defaultdict)
obj3={'a':{'aa':1,'aa1':2},'b':{'bb':2},'c':3}
obj4={'a':{'aa':5,'aa1':6},'b':{'bb':7},'c':8}
defsum_value(obj):
forkeyinobj:
iftype(obj[key]).__name__=='dict':
ifkeynotinall_room:
all_room[key]={}
forsubkeyinobj[key]:
ifsubkeynotinall_room[key]:
all_room[key][subkey]=0
all_room[key][subkey]+=obj[key][subkey]
else:
ifkeynotinall_room:
all_room[key]=0
all_room[key]+=obj[key]
returnall_room
看一下结果:
sum_value(obj3)
Out[40]:
defaultdict(collections.defaultdict,
{'a':{'aa':1,'aa1':2},'b':{'bb':2},'c':3})
sum_value(obj4)
Out[41]:
defaultdict(collections.defaultdict,
{'a':{'aa':6,'aa1':8},'b':{'bb':9},'c':11})
实现了文章开头所述功能。
sum_value(obj)这个函数可以实现对多个二维字典的键值相加,只要创建一个for循环就行了。
(2)往字典的key里添加一个新的value:
同样提供一个应用场景:
dict1={'order1':['room1','room1'],'order2':['room3','room3']}
dict2={'order1':'room2','order2':'room3'}
我的目的是想把dict2中key里的value添加进dict1中相同的key里,理想结果如下:
dict1={'order1':['room1','room1','room2'],'order2':['room3','room3','room3']}
下面给出实现代码:
forkeyindict1.keys(): a=[] b=[] b=dict1[key] foriinb:##这一步很关键,目的是把dict1[key]的value值逐个取出存进a,再把dict2[key]的value值存进a里面,这样可以避免dict1[key]出现多个list层 a.append(i) a.append(dict2[key])##dict2[key]必须保证只有一个元素 dict1[key]=a
结果如下:
dict1
Out[88]:{'order1':['room1','room1','room2'],'order2':['room3','room3','room3']}
下一步,统计key中的value个数:
fromcollectionsimportCounter forkey,itemindict1.items(): count[key]=Counter(item)
结果如下:
count
Out[91]:{'order1':Counter({'room1':2,'room2':1}),'order2':Counter({'room3':3})}
接着,取出每个外层key中里层value最大的key(比较拗口,即取出每个orderid中roomid的值最大的roomid):
(举个例子,在order1中,room1的值为2,是最大值,所以我把room1赋给order1,即result1={'order1':'room1'})
result={}
forkey,itemincount.items():
result[key]=max(item,key=item.get)
结果如下:
result
Out[94]:{'order1':'room1','order2':'room3'}
(3)字典的排序:sorted()函数
importoperator
dic={(1,2):3,(1,3):4,(4,5):14}##字典的key可以是元组;
ds=sorted(dic.items(),key=operator.itemgetter(1),reverse=True)##如果要升序排列,把reverse=True去掉即可;
ds
Out[21]:[((4,5),14),((1,3),4),((1,2),3)]
(4)字典中不允许出现一个键对应多个值的情况,当出现这种情况时,取最后的键值对:
如:
>>>dict1={'foo':789,'foo':'xyz'}
>>>dict1结果:{'foo':'xyz'}
以上这篇python实现二维字典的键值合并等函数就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。