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编程实现输入某年某月某日计算出这一天是该年第几天的方法
Apr 18 Python
Python实现完整的事务操作示例
Jun 20 Python
python编程通过蒙特卡洛法计算定积分详解
Dec 13 Python
python MySQLdb使用教程详解
Mar 20 Python
python字符串常用方法
Jun 14 Python
Python日志:自定义输出字段 json格式输出方式
Apr 27 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
Jun 02 Python
终于搞懂了Keras中multiloss的对应关系介绍
Jun 22 Python
Python文件夹批处理操作代码实例
Jul 21 Python
用Python进行websocket接口测试
Oct 16 Python
pytorch加载语音类自定义数据集的方法教程
Nov 10 Python
Python天气语音播报小助手
Sep 25 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
索尼SONY ICF-7600A(W)电路分析
2021/03/01 无线电
php获取mysql版本的几种方法小结
2008/03/25 PHP
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
php跨服务器访问方法小结
2015/05/12 PHP
javascript ready和load事件的区别示例介绍
2013/08/30 Javascript
js的alert样式如何更改如背景颜色
2014/01/22 Javascript
javascript实现checkbox复选框实例代码
2016/01/10 Javascript
解决js函数闭包内存泄露问题的办法
2016/01/25 Javascript
jquery精度计算代码 jquery指定精确小数位
2017/02/06 Javascript
angularjs实现首页轮播图效果
2017/04/14 Javascript
Angular 2父子组件数据传递之@Input和@Output详解(下)
2017/07/05 Javascript
Vuejs中使用markdown服务器端渲染的示例
2017/11/22 Javascript
layui插件表单验证提交触发提交的例子
2019/09/09 Javascript
vuex + keep-alive实现tab标签页面缓存功能
2019/10/17 Javascript
ElementUI多个子组件表单的校验管理实现
2019/11/07 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
Python学习小技巧之利用字典的默认行为
2017/05/20 Python
python绘制条形图方法代码详解
2017/12/19 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
2018/06/14 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
对python读取zip压缩文件里面的csv数据实例详解
2019/02/08 Python
python实现合并多个list及合并多个django QuerySet的方法示例
2019/06/11 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
2020/02/18 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
python urllib和urllib3知识点总结
2021/02/08 Python
详解HTML5中rel属性的prefetch预加载功能使用
2016/05/06 HTML / CSS
SQL Server 2000数据库的文件有哪些,分别进行描述
2013/03/30 面试题
铭万公司.net面试题笔试题
2014/07/20 面试题
毕业自我评价范文
2013/11/17 职场文书
人力资源管理毕业生自荐信
2014/06/26 职场文书
企业消防安全责任书
2014/07/23 职场文书
毕业生个人自荐书
2015/03/05 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
暑假开始了,你的暑假学习计划写好了吗?
2019/07/04 职场文书