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实现的彩票机选器实例
Jun 17 Python
Python 文件管理实例详解
Nov 10 Python
详解Python中的from..import绝对导入语句
Jun 21 Python
python正则表达式的使用
Jun 12 Python
python中for循环输出列表索引与对应的值方法
Nov 07 Python
python sklearn库实现简单逻辑回归的实例代码
Jul 01 Python
如何利用python给图片添加半透明水印
Sep 06 Python
numpy按列连接两个维数不同的数组方式
Dec 06 Python
Numpy中的数组搜索中np.where方法详细介绍
Jan 08 Python
教你怎么用Python实现多路径迷宫
Apr 29 Python
python实现简单的井字棋
May 26 Python
Python anaconda安装库命令详解
Oct 16 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导出csv格式数据并将数字转换成文本的思路以及代码分享
2014/06/05 PHP
php获取字符串中各个字符出现次数的方法
2015/02/23 PHP
PHP 二级子目录(后台目录)设置二级域名
2017/03/02 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
2020/04/26 PHP
详解php反序列化
2020/06/10 PHP
jQuery中将函数赋值给变量的调用方法
2012/03/23 Javascript
JQuery仿小米手机抢购页面倒计时效果
2014/12/16 Javascript
jQuery中not()方法用法实例
2015/01/06 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
2015/02/20 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
smartcrop.js智能图片裁剪库
2015/10/14 Javascript
浅谈JS继承_寄生式继承 & 寄生组合式继承
2016/08/16 Javascript
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
vue2利用Bus.js如何实现非父子组件通信详解
2017/08/25 Javascript
加载 vue 远程代码的组件实例详解
2017/11/20 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
vue-router的两种模式的区别
2019/05/30 Javascript
jQuery实现倒计时功能完整示例
2020/06/01 jQuery
v-slot和slot、slot-scope之间相互替换实例
2020/09/04 Javascript
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
[47:03]Ti4第二日主赛事败者组 LGD vs iG 2
2014/07/21 DOTA
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
django配置连接数据库及原生sql语句的使用方法
2019/03/03 Python
Waterford英国官方网站:世界上最受欢迎的优质水晶品牌
2019/08/17 全球购物
小学教师岗位职责
2013/11/25 职场文书
药店主任岗位责任制
2014/02/10 职场文书
应聘销售主管的求职信
2014/04/26 职场文书
村容村貌整治方案
2014/05/21 职场文书
社区志愿者活动方案
2014/08/18 职场文书
学生检讨书范文
2015/01/27 职场文书
大学生暑假实习总结
2015/07/13 职场文书
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang
Python中的嵌套循环详情
2022/03/23 Python
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS