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实现全角半角转换的方法
Aug 18 Python
python3编写C/S网络程序实例教程
Aug 25 Python
Python多线程编程(二):启动线程的两种方法
Apr 05 Python
python对html代码进行escape编码的方法
May 04 Python
在Python的Flask框架中验证注册用户的Email的方法
Sep 02 Python
全面理解Python中self的用法
Jun 04 Python
Python中logging实例讲解
Jan 17 Python
python字符串常用方法及文件简单读写的操作方法
Mar 04 Python
如何理解python中数字列表
May 29 Python
keras实现VGG16方式(预测一张图片)
Jul 07 Python
python实现canny边缘检测
Sep 14 Python
python中pandas.read_csv()函数的深入讲解
Mar 29 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基础知识:类与对象(1)
2006/12/13 PHP
discuz程序的PHP加密函数原理分析
2011/08/05 PHP
php中的比较运算符详解
2013/10/28 PHP
php定时执行任务设置详解
2015/02/06 PHP
PHP添加图片水印、压缩、剪切的封装类
2015/08/17 PHP
带你了解PHP7 性能翻倍的关键
2015/11/19 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
2020/08/06 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
JS模仿手机端九宫格登录功能实现代码
2016/04/28 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
JS原型与原型链的深入理解
2017/02/15 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
Vue波纹按钮组件制作
2018/04/30 Javascript
微信小程序视图容器(swiper)组件创建轮播图
2020/06/19 Javascript
angularjs下ng-repeat点击元素改变样式的实现方法
2018/09/12 Javascript
vue-cli设置publicPath小记
2020/04/14 Javascript
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
Python Tkinter简单布局实例教程
2014/09/03 Python
Django学习笔记之Class-Based-View
2017/02/15 Python
Python count函数使用方法实例解析
2020/03/23 Python
PyTorch: Softmax多分类实战操作
2020/07/07 Python
英国最大的电脑零售连锁店集团:PC World
2016/10/10 全球购物
墨西哥巴士车票在线购买:ClickBus
2018/03/27 全球购物
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
经典演讲稿开场白
2014/08/25 职场文书
社区助残日活动总结
2014/08/29 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
党的群众路线教育实践活动总结材料
2014/10/30 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
实习单位指导教师评语
2014/12/30 职场文书
会议欢迎词范文
2015/01/27 职场文书
2015年教师党员自我评价材料
2015/03/04 职场文书
客户答谢会致辞
2015/07/30 职场文书