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 相关文章推荐
wxpython中利用线程防止假死的实现方法
Aug 11 Python
Python标准库之随机数 (math包、random包)介绍
Nov 25 Python
python数组过滤实现方法
Jul 27 Python
Python语法快速入门指南
Oct 12 Python
Python通过OpenCV的findContours获取轮廓并切割实例
Jan 05 Python
numpy中以文本的方式存储以及读取数据方法
Jun 04 Python
mac下pycharm设置python版本的图文教程
Jun 13 Python
使用python去除图片白色像素的实例
Dec 12 Python
Python基于爬虫实现全网搜索并下载音乐
Feb 14 Python
安装pytorch时报sslerror错误的解决方案
May 17 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 Python
pytorch中的torch.nn.Conv2d()函数图文详解
Feb 28 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中调用JAVA
2006/10/09 PHP
PHP的FTP学习(二)[转自奥索]
2006/10/09 PHP
PHP flock 文件锁详细介绍
2012/12/29 PHP
基于MySQL体系结构的分析
2013/05/02 PHP
PHP提取字符串中的手机号正则表达式怎么写
2017/07/17 PHP
php关联数组与索引数组及其显示方法
2018/03/12 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
JavaScript 学习笔记(五)
2009/12/31 Javascript
用JS实现一个TreeMenu效果分享
2011/08/28 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
JS实现仿QQ效果的三级竖向菜单
2015/09/25 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
2017/07/20 jQuery
利用JS制作万年历的方法
2017/08/16 Javascript
JavaScript强制类型转换和隐式类型转换操作示例
2019/05/01 Javascript
小程序中英文混合排序问题解决
2019/08/02 Javascript
[04:19]DOTA2完美大师赛第四天精彩集锦
2017/11/26 DOTA
[01:47]2018年度DOTA2最佳教练-完美盛典
2018/12/16 DOTA
python 随机数生成的代码的详细分析
2011/05/15 Python
python实现的一个火车票转让信息采集器
2014/07/09 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
关于Python如何避免循环导入问题详解
2017/09/14 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
使用PIL(Python-Imaging)反转图像的颜色方法
2019/01/24 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
用纯CSS3实现网页中常见的小箭头
2017/10/16 HTML / CSS
超30万乐谱下载:Musicnotes.com
2016/09/24 全球购物
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
材料成型专业个人求职信范文
2013/09/25 职场文书
会计电算化专业个人的自我评价
2013/11/24 职场文书
教师个人的自我评价分享
2014/01/02 职场文书
2014信息公开实施方案
2014/02/22 职场文书
竞聘书模板
2014/03/31 职场文书
商业街策划方案
2014/05/31 职场文书
团队激励口号
2014/06/06 职场文书