举例讲解Python中字典的合并值相加与异或对比


Posted in Python onJune 04, 2016

字典合并值相加
在统计汇总游戏数据的时候,有些数据是是每天用字典存的,当我要对多天汇总的时候,就需要合并字典了。
如果key相同的话它们的值就相加。
不能用update方法,因为用update方法则相同的key的值会覆盖,而不是相加。
千言不如一码。

def union_dict(*objs): 
  _keys = set(sum([obj.keys() for obj in objs],[])) 
  _total = {} 
  for _key in _keys: 
    _total[_key] = sum([obj.get(_key,0) for obj in objs]) 
  return _total 
 
obj1 = {'a':1,'b':2,'c':3} 
obj2 = {'a':1,'b':3,'d':4} 
print union_dict(obj1,obj2)

 
输出

{'a': 2, 'c': 3, 'b': 5, 'd': 4}

sum([obj.keys() for obj in objs],[])这句可能不太好理解。
其实sum()函数也有"鲜为人知的参数",即第2个参数,start参数,默认是0。
而且不止可以是int类型,还可以是其他支持+操作符的东西,比如[]。
利用这一点,可以对二层数组打平成一层。
比如

>>sum([[1,2,3],[4,5]],[])
[1,2,3,4,5]

对字典diff("异或")
在游戏中,我要监控记录物品系统中的背包变动情况。("异或"的结果是相同的消除,剩下不同的,即变动的)
假设背包的存储结构是这样的。
是一个字典,{物品id:数量}。
在背包类初始化的时候,把背包物品信息copy保存到一个oldbag变量,进行一些物品操作后(比如使用物品,领取物品奖励等),在调用save()方法存进redis时,对新的bag字典与oldbag字典进行差异对比就得出变动情况了。
千言不如一码。

def symmetric_difference(_oldobj,_newobj): 
  _oldkeys = _oldobj.keys() 
  _newkeys = _newobj.keys() 
  _diff = {} 
  for _key in set(_oldkeys + _newkeys): 
    _val = _newobj.get(_key,0) - _oldobj.get(_key,0) 
    if _val: 
      _diff[_key] = _val  
  return _diff  
 
oldobj = {'a':1,'b':2,'c':3} 
newobj = {'a':1,'b':3,'d':4} 
print symmetric_difference(oldobj,newobj)

输出

{'b': 1, 'd': 4,'c': -3}

代表玩家得到了1个'b'物品,4个'd'物品,失去了3个'c'物品。

Python 相关文章推荐
浅谈Python 集合(set)类型的操作——并交差
Jun 30 Python
基于Python的关键字监控及告警
Jul 06 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
Jan 24 Python
python实现生成字符串大小写字母和数字的各种组合
Jan 01 Python
Python2 Selenium元素定位的实现(8种)
Feb 25 Python
Python 获取windows桌面路径的5种方法小结
Jul 15 Python
django如何通过类视图使用装饰器
Jul 24 Python
Python测试模块doctest使用解析
Aug 10 Python
Laravel框架表单验证格式化输出的方法
Sep 25 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
May 29 Python
python使用bs4爬取boss直聘静态页面
Oct 10 Python
python 实时调取摄像头的示例代码
Nov 25 Python
详解Python中open()函数指定文件打开方式的用法
Jun 04 #Python
Python中import导入上一级目录模块及循环import问题的解决
Jun 04 #Python
Python输出汉字字库及将文字转换为图片的方法
Jun 04 #Python
使用Python的Flask框架来搭建第一个Web应用程序
Jun 04 #Python
Python的Django中将文件上传至七牛云存储的代码分享
Jun 03 #Python
详解duck typing鸭子类型程序设计与Python的实现示例
Jun 03 #Python
详解字典树Trie结构及其Python代码实现
Jun 03 #Python
You might like
非洲第一个咖啡超凡杯大赛承办国—卢旺达的咖啡怎么样
2021/03/03 咖啡文化
Yii基于CActiveForm的Ajax数据验证用法示例
2016/07/14 PHP
PHP单例模式数据库连接类与页面静态化实现方法
2019/03/20 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
2019/10/24 PHP
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
javascript globalStorage类代码
2009/06/04 Javascript
基于jquery的blockui插件显示弹出层
2011/04/14 Javascript
Javascript模拟加速运动与减速运动代码分享
2014/12/11 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
ionic由于使用了header和subheader导致被遮挡的问题的两种解决方法
2016/09/22 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
2017/06/11 Javascript
浅谈Koa服务限流方法实践
2017/10/23 Javascript
浅谈Vue.js中ref ($refs)用法举例总结
2017/12/19 Javascript
element-ui中的select下拉列表设置默认值方法
2018/08/24 Javascript
对angularjs框架下controller间的传值方法详解
2018/10/08 Javascript
vue拖拽排序插件vuedraggable使用方法详解
2020/08/21 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
详解Vue项目部署遇到的问题及解决方案
2019/01/11 Javascript
Angular Excel 导入与导出的实现代码
2019/04/17 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
Vue运用transition实现过渡动画
2019/05/06 Javascript
js实现移动端图片滑块验证功能
2020/09/29 Javascript
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
学习python类方法与对象方法
2016/03/15 Python
学Python 3的理由和必要性
2019/11/19 Python
通过实例学习Python Excel操作
2020/01/06 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
Python devel安装失败问题解决方案
2020/06/09 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
Python爬虫之Selenium多窗口切换的实现
2020/12/04 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
html5开发之viewport使用
2013/10/17 HTML / CSS
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
向领导表决心的话
2014/03/11 职场文书
先进事迹材料范文
2014/12/29 职场文书
dubbo集成zipkin获取Traceid的实现
2021/07/26 Java/Android