举例讲解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的lambda语句声明匿名函数的用法
Jul 01 Python
Python 序列的方法总结
Oct 18 Python
Python实现批量检测HTTP服务的状态
Oct 27 Python
python实现用户管理系统
Jan 10 Python
Python 使用PIL numpy 实现拼接图片的示例
May 08 Python
python实现基于信息增益的决策树归纳
Dec 18 Python
Python将字符串常量转化为变量方法总结
Mar 17 Python
pytz格式化北京时间多出6分钟问题的解决方法
Jun 21 Python
详解Python对JSON中的特殊类型进行Encoder
Jul 15 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
Aug 28 Python
Python startswith()和endswith() 方法原理解析
Apr 28 Python
python实现简单的三子棋游戏
Apr 28 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
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
ThinkPHP分页实例
2014/10/15 PHP
实例讲解yii2.0在php命令行中运行的步骤
2015/12/01 PHP
Yii2.0实现生成二维码功能实例
2017/10/24 PHP
phpinfo的知识点总结
2019/10/10 PHP
解决laravel session失效的问题
2019/10/14 PHP
JQuery 风格的HTML文本转义
2009/07/01 Javascript
JavaScript获取各大浏览器信息图示
2015/11/20 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
2016/06/08 Javascript
微信小程序实现图片轮播及文件上传
2017/04/07 Javascript
微信小程序 跳转传递数据的实例
2017/07/06 Javascript
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
JS实现字符串中去除指定子字符串方法分析
2018/05/17 Javascript
Koa 使用小技巧(小结)
2018/10/22 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
2019/11/01 Javascript
js判断密码强度的方法
2020/03/18 Javascript
layui使用及简单的三级联动实现教程
2020/12/01 Javascript
让 python 命令行也可以自动补全
2014/11/30 Python
Python编写百度贴吧的简单爬虫
2015/04/02 Python
详解python实现读取邮件数据并下载附件的实例
2017/08/03 Python
unittest+coverage单元测试代码覆盖操作实例详解
2018/04/04 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
python文件操作的简单方法总结
2019/11/07 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
2019/12/12 Python
Anaconda+vscode+pytorch环境搭建过程详解
2020/05/25 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
送给程序员的20个Java集合面试问题
2014/08/06 面试题
工业自动化专业毕业生推荐信
2013/11/18 职场文书
车间组长岗位职责
2013/12/20 职场文书
车间机修工岗位职责
2014/02/28 职场文书
小学生操行评语
2014/04/22 职场文书
中秋客户感谢信
2015/01/22 职场文书
生日寿星公答谢词
2015/09/29 职场文书