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的Flask框架中构建Web表单的教程
Jun 04 Python
Python之Web框架Django项目搭建全过程
May 02 Python
python中map()函数的使用方法示例
Sep 29 Python
python 中if else 语句的作用及示例代码
Mar 05 Python
python读取Excel实例详解
Aug 17 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
Dec 20 Python
Python使用修饰器进行异常日志记录操作示例
Mar 19 Python
Python API自动化框架总结
Nov 12 Python
python中如何打包用户自定义模块
Sep 23 Python
用ldap作为django后端用户登录验证的实现
Dec 07 Python
python实现xml转json文件的示例代码
Dec 30 Python
Python中的套接字编程是什么?
Jun 21 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
CI框架中libraries,helpers,hooks文件夹详细说明
2014/06/10 PHP
php实现微信发红包
2015/12/05 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
2020/05/14 PHP
不用写JS也能使用EXTJS视频演示
2008/12/29 Javascript
Javascript 键盘keyCode键码值表
2009/12/24 Javascript
顶部缓冲下拉菜单导航特效的JS代码
2013/08/27 Javascript
jQuery中animate用法实例分析
2015/03/09 Javascript
在JavaScript中操作时间之getUTCDate()方法的使用
2015/06/10 Javascript
详解XMLHttpRequest(一)同步请求和异步请求
2016/09/14 Javascript
jQuery模拟实现的select点击选择效果【附demo源码下载】
2016/11/09 Javascript
javascript 中关于array的常用方法详解
2017/05/05 Javascript
jquery.masonry瀑布流效果
2017/05/25 jQuery
在vue-cli的组件模板里使用font-awesome的两种方法
2018/09/28 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
在vue+element ui框架里实现lodash的debounce防抖
2019/11/13 Javascript
javascript实现移动端红包雨页面
2020/06/23 Javascript
Python操作列表之List.insert()方法的使用
2015/05/20 Python
11月编程语言排行榜 Python逆袭C#上升到第4
2017/11/15 Python
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
Python实现的调用C语言函数功能简单实例
2019/03/13 Python
使用Pyhton集合set()实现成果查漏的例子
2019/11/24 Python
python获取栅格点和面值的实现
2020/03/10 Python
Django 实现将图片转为Base64,然后使用json传输
2020/03/27 Python
水果花束:Fruit Bouquets
2017/12/20 全球购物
澳大利亚珠宝商:Shiels
2019/10/06 全球购物
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
2014村书记党建工作汇报材料
2014/11/02 职场文书
党员民主生活会材料
2014/12/15 职场文书
八年级物理教学反思
2016/02/19 职场文书
JavaScript 防篡改对象的用法示例
2021/04/24 Javascript
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
2021/05/17 Python
Java基础之线程锁相关知识总结
2021/06/30 Java/Android
webpack的移动端适配方案小结
2021/07/25 Javascript
pytorch实现加载保存查看checkpoint文件
2022/07/15 Python