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实现忽略大小写对字符串列表排序的方法
Sep 25 Python
Python中字符串的格式化方法小结
May 03 Python
Python删除Java源文件中全部注释的实现方法
Aug 30 Python
Django中ORM表的创建和增删改查方法示例
Nov 15 Python
python构建深度神经网络(续)
Mar 10 Python
python pandas消除空值和空格以及 Nan数据替换方法
Oct 30 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
Jan 07 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
Oct 12 Python
Python 实现训练集、测试集随机划分
Jan 08 Python
Django模板之基本的 for 循环 和 List内容的显示方式
Mar 31 Python
Django实现后台上传并显示图片功能
May 29 Python
python和js交互调用的方法
Jun 23 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连接mssql的一些相关经验及注意事项
2013/02/05 PHP
PHP Curl出现403错误的解决办法
2014/05/29 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
PHP符合PSR编程规范的实例分享
2016/12/21 PHP
jquery lazyload延迟加载技术的实现原理分析
2011/01/24 Javascript
jquery学习笔记 用jquery实现无刷新登录
2011/08/08 Javascript
JS中showModalDialog 的使用解析
2013/04/17 Javascript
jQuery实现类似滑动门切换效果的层切换
2013/09/23 Javascript
Windows系统中安装nodejs图文教程
2015/02/28 NodeJs
JS实现仿Windows经典风格的选项卡Tab切换代码
2015/10/20 Javascript
微信小程序 loading 详解及实例代码
2016/11/09 Javascript
javascript实现简易计算器
2017/02/01 Javascript
详解vue2.0组件通信各种情况总结与实例分析
2017/03/22 Javascript
Vuejs中使用markdown服务器端渲染的示例
2017/11/22 Javascript
Vue前端开发规范整理(推荐)
2018/04/23 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
2019/09/03 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
使用Python的PIL模块来进行图片对比
2016/02/18 Python
python制作小说爬虫实录
2017/08/14 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
关于pymysql模块的使用以及代码详解
2019/09/01 Python
python+OpenCV实现车牌号码识别
2019/11/08 Python
Python调用钉钉自定义机器人的实现
2020/01/03 Python
Python多线程获取返回值代码实例
2020/02/17 Python
Windows 下python3.8环境安装教程图文详解
2020/03/11 Python
python实现学生信息管理系统源码
2021/02/22 Python
适合各种场合的美食礼品:Harry & David
2016/08/03 全球购物
米兰必去买手店排行榜首位:Antonioli
2016/09/11 全球购物
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
翻译学院毕业生自荐书
2014/02/02 职场文书
如何写好建议书
2014/03/13 职场文书
职工擅自离岗检讨书
2014/09/23 职场文书
万能检讨书
2015/01/27 职场文书
redis 查看所有的key方式
2021/05/07 Redis
springboot中的pom文件 project报错问题
2022/01/18 Java/Android