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实现360皮肤按钮控件示例
Feb 21 Python
在Python的gevent框架下执行异步的Solr查询的教程
Apr 16 Python
Python中防止sql注入的方法详解
Feb 25 Python
Python实现的科学计算器功能示例
Aug 04 Python
django中静态文件配置static的方法
May 20 Python
Django Rest framework频率原理与限制
Jul 26 Python
python输入错误后删除的方法
Oct 12 Python
Python socket实现的文件下载器功能示例
Nov 15 Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 Python
Keras中 ImageDataGenerator函数的参数用法
Jul 03 Python
Python+Opencv身份证号码区域提取及识别实现
Aug 25 Python
python如何获得list或numpy数组中最大元素对应的索引
Nov 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
第九节--绑定
2006/11/16 PHP
php 正则 过滤html 的超链接
2009/06/02 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
浅谈PHP表单提交(POST&GET&URL编/解码)
2017/04/03 PHP
jQuery Autocomplete自动完成插件
2010/07/17 Javascript
js setTimeout 参数传递使用介绍
2013/08/13 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
JavaScript中toString()方法的使用详解
2015/06/05 Javascript
详解AngularJS中的作用域
2015/06/17 Javascript
微信小程序 loading(加载中提示框)实例
2016/10/28 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
Bootstrap 3 按钮标签实例代码
2017/02/21 Javascript
利用jQuery实现一个简单的表格上下翻页效果
2017/03/14 Javascript
jQuery中的deferred使用方法
2017/03/27 jQuery
微信小程序网络请求的封装与填坑之路
2017/04/01 Javascript
JS实现HTML页面中动态显示当前时间完整示例
2018/07/30 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
[44:41]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[43:03]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
Python socket实现的简单通信功能示例
2018/08/21 Python
python实现一个简单的ping工具方法
2019/01/31 Python
python打印直角三角形与等腰三角形实例代码
2019/10/20 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
Python常用GUI框架原理解析汇总
2020/12/07 Python
matplotlib事件处理基础(事件绑定、事件属性)
2021/02/03 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
函授本科自我鉴定
2014/02/04 职场文书
解除劳动合同协议书范本
2014/09/13 职场文书
公司授权委托书
2014/10/17 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
中学教师读书笔记
2015/07/01 职场文书
2015中学政教处工作总结
2015/07/22 职场文书
分享node.js实现简单登录注册的具体代码
2022/04/26 NodeJs
numpy array找出符合条件的数并赋值的示例代码
2022/06/01 Python