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中面向对象编程的相关知识
May 25 Python
Python装饰器语法糖
Jan 02 Python
Python 实现文件打包、上传与校验的方法
Feb 13 Python
python使用pipeline批量读写redis的方法
Feb 18 Python
Python3 log10()函数简单用法
Feb 19 Python
Python中断多重循环的思路总结
Oct 04 Python
python kafka 多线程消费者&手动提交实例
Dec 21 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
Jun 23 Python
python实现三壶谜题的示例详解
Nov 02 Python
python实现excel公式格式化的示例代码
Dec 23 Python
用Python自动清理系统垃圾的实现
Jan 18 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
Jun 09 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写的MySQL数据库用户认证系统代码
2007/03/22 PHP
有关phpmailer的详细介绍及使用方法
2013/01/28 PHP
php数组中删除元素之重新索引的方法
2014/09/16 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
phpStorm2020 注册码
2020/09/17 PHP
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
2013/04/15 Javascript
js关闭浏览器窗口及检查浏览器关闭事件
2013/09/03 Javascript
javascript获取元素离文档各边距离的方法
2015/02/13 Javascript
JS实现浏览器状态栏显示时间的方法
2015/10/27 Javascript
基于Vuejs实现购物车功能
2016/08/02 Javascript
Bootstrapvalidator校验、校验清除重置的实现代码(推荐)
2016/09/28 Javascript
基于JavaScript实现带缩略图的轮播效果
2017/01/12 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
2017/12/19 Javascript
VeeValidate在vue项目里表单校验应用案例
2018/05/09 Javascript
vue源码nextTick使用及原理解析
2019/08/13 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
2020/06/04 Javascript
JS中的变量作用域(console版)
2020/07/18 Javascript
Python 实现国产SM3加密算法的示例代码
2020/09/21 Python
python读取excel数据绘制简单曲线图的完整步骤记录
2020/10/30 Python
Python学习之time模块的基本使用
2021/01/17 Python
python包的导入方式总结
2021/03/02 Python
css3+jq创作含苞待放的荷花
2014/02/20 HTML / CSS
工作交流会欢迎词
2014/01/12 职场文书
户籍证明格式
2014/09/15 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
通知怎么写?
2019/04/17 职场文书
话题作文之呼唤
2019/12/18 职场文书
nginx配置文件使用环境变量的操作方法
2021/06/02 Servers
用Python selenium实现淘宝抢单机器人
2021/06/18 Python
JS实现简单的九宫格抽奖
2022/06/28 Javascript
Spring Boot实现文件上传下载
2022/08/14 Java/Android