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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。