python 实现二维字典的键值合并等函数


Posted in Python onDecember 06, 2019

这篇文章主要讲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:

from collections import defaultdict
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}
def sum_value(obj):
 for key in obj:
  if type(obj[key]).__name__ == 'dict':
   if key not in all_room:
    all_room[key] = {}
   for subkey in obj[key]:
    if subkey not in all_room[key]:
     all_room[key][subkey] = 0
    all_room[key][subkey] += obj[key][subkey] 
  else:
   if key not in all_room:
    all_room[key] = 0
   all_room[key] += obj[key]
 return all_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']}

下面给出实现代码:

for key in dict1.keys():
 a=[]
 b=[]
 b = dict1[key] 
 for i in b: ##这一步很关键,目的是把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个数:

from collections import Counter
for key,item in dict1.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 = {}
for key,item in count.items():
 result[key] = max(item,key=item.get)

结果如下:

result
Out[94]: {'order1': 'room1', 'order2': 'room3'}

(3)字典的排序:sorted()函数

import operator
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 实现二维字典的键值合并等函数就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之再深点,更懂list
Sep 20 Python
Python定时执行之Timer用法示例
May 27 Python
Python中的getopt函数使用详解
Jul 28 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
Nov 08 Python
Python 忽略warning的输出方法
Oct 18 Python
Flask框架搭建虚拟环境的步骤分析
Dec 21 Python
python颜色随机生成器的实例代码
Jan 10 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
Feb 21 Python
python实现UDP协议下的文件传输
Mar 20 Python
解决Jupyter NoteBook输出的图表太小看不清问题
Apr 16 Python
python代码区分大小写吗
Jun 17 Python
Python+MySQL随机试卷及答案生成程序的示例代码
Feb 01 Python
python二分法查找算法实现方法【递归与非递归】
Dec 06 #Python
python二维键值数组生成转json的例子
Dec 06 #Python
python加载自定义词典实例
Dec 06 #Python
Python 词典(Dict) 加载与保存示例
Dec 06 #Python
python3 dict ndarray 存成json,并保留原数据精度的实例
Dec 06 #Python
django formset实现数据表的批量操作的示例代码
Dec 06 #Python
Python手绘可视化工具cutecharts使用实例
Dec 05 #Python
You might like
php时间计算相关问题小结
2016/05/09 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
NodeJS 模块开发及发布详解分享
2012/03/07 NodeJs
不同Jquery版本引发的问题解决
2013/10/14 Javascript
jQuery Ajax异步处理Json数据详解
2013/11/05 Javascript
jQuery中insertBefore()方法用法实例
2015/01/08 Javascript
全面解析Bootstrap弹窗的实现方法
2015/12/01 Javascript
Js调用Java方法并互相传参的简单实例
2016/08/11 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
Parcel 打包示例(React HelloWorld)
2018/01/16 Javascript
webpack-dev-server自动更新页面方法
2018/02/22 Javascript
基于Vue实现拖拽效果
2018/04/27 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
简单了解JavaScript弹窗实现代码
2020/05/07 Javascript
vue 动态组件(component :is) 和 dom元素限制(is)用法说明
2020/09/04 Javascript
[01:38]完美世界DOTA2联赛PWL S3 集锦第四期
2020/12/21 DOTA
Python面向对象编程之继承与多态详解
2018/01/16 Python
Python通用循环的构造方法实例分析
2018/12/19 Python
Python数据可视化实现正态分布(高斯分布)
2019/08/21 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
使用Python构造hive insert语句说明
2020/06/06 Python
巴西电子产品购物网站:Saldão da Informática
2018/01/09 全球购物
玉兰油美国官网:OLAY美国
2018/10/25 全球购物
入党思想汇报
2014/01/05 职场文书
单位人事专员介绍信
2014/01/11 职场文书
关于工资低的辞职信
2014/01/14 职场文书
运动会表扬稿大全
2014/01/16 职场文书
校本培训个人总结
2015/02/28 职场文书
技术员个人工作总结
2015/03/03 职场文书
预防职务犯罪警示教育心得体会
2016/01/15 职场文书
高三化学教学反思
2016/02/22 职场文书
七年级作文之英语老师
2019/10/28 职场文书
2019年第四季度财务部门工作计划
2019/11/02 职场文书
Tomcat弱口令复现及利用
2022/05/06 Servers
Spring Security动态权限的实现方法详解
2022/06/16 Java/Android