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 相关文章推荐
基于Django模板中的数字自增(详解)
Sep 05 Python
python和shell监控linux服务器的详细代码
Jun 22 Python
django 捕获异常和日志系统过程详解
Jul 18 Python
python 爬虫百度地图的信息界面的实现方法
Oct 27 Python
Ranorex通过Python将报告发送到邮箱的方法
Jan 12 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
Feb 12 Python
一些关于python 装饰器的个人理解
Aug 31 Python
python批量生成条形码的示例
Oct 10 Python
python实现发送QQ邮件(可加附件)
Dec 23 Python
django项目中使用云片网发送短信验证码的实现
Jan 19 Python
python 制作磁力搜索工具
Mar 04 Python
pytorch 使用半精度模型部署的操作
May 24 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
?繁体转换的class
2006/10/09 PHP
使用php-timeit估计php函数的执行时间
2015/09/06 PHP
PHP实现清除MySQL死连接的方法
2016/07/23 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
2017/11/06 PHP
解析John Resig Simple JavaScript Inheritance代码
2012/12/03 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
jQuery实现的向下图文信息滚动效果
2015/05/03 Javascript
JavaScript实现的简单烟花特效代码
2015/10/20 Javascript
AngularJS打开页面隐藏显示表达式用法示例
2016/12/25 Javascript
Node.js实现文件上传的示例
2017/06/28 Javascript
js判断节假日实例代码
2017/12/27 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
小程序清理本地缓存的方法
2018/08/17 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
2018/08/31 Javascript
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
2019/04/29 NodeJs
bootstrap table列和表头对不齐的解决方法
2019/07/19 Javascript
javascript 构建模块化开发过程解析
2019/09/11 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
Python 多线程Threading初学教程
2017/08/22 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
2018/07/09 Python
Python三维绘图之Matplotlib库的使用方法
2020/09/20 Python
Python实例教程之检索输出月份日历表
2020/12/16 Python
TensorFlow低版本代码自动升级为1.0版本
2021/02/20 Python
在HTML5 canvas里用卷积核进行图像处理的方法
2018/05/02 HTML / CSS
Scholastic父母商店:儿童书籍
2017/01/01 全球购物
连卡佛中国官网:Lane Crawford中文站
2018/01/27 全球购物
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
Hello Molly美国:女性时尚在线
2019/08/26 全球购物
建筑毕业生自我鉴定
2013/10/18 职场文书
个人实用简单的自我评价
2013/10/19 职场文书
《要下雨了》教学反思
2014/02/17 职场文书
小学生六年级作文之关于感恩
2019/08/16 职场文书
Vue3中toRef与toRefs的区别
2022/03/24 Vue.js