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

字典合并值相加
在统计汇总游戏数据的时候,有些数据是是每天用字典存的,当我要对多天汇总的时候,就需要合并字典了。
如果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'物品。

时间: 2016-06-03

Python中字典(dict)合并的四种方法总结

本文主要给大家介绍了关于Python中字典(dict)合并的四种方法,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍: 字典是Python语言中唯一的映射类型. 映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表. 字典对象是可变的,它是一个容器类型,能存储任意个数的Python对象,其中也可包括其他容器类型. 字典类型与序列类型的区别: 1. 存取和访问数据的方式不同. 2. 序列类型只用数字类型的键(从序列的开始按数值顺序索引

Python实现合并字典的方法

本文实例讲述了Python实现合并字典的方法.分享给大家供大家参考.具体实现方法如下: # 将两个字典合并 #!/usr/bin/python def adddict(dict1,dict2): xin = {} for key in dict1.keys(): xin[key] = dict1[key] for key in dict2.keys(): xin[key] = dict2[key] return xin s1 = {1:222,'c':'d','e':'f'} s2 = {2:3

Python合并两个字典的常用方法与效率比较

本文实例讲述了Python合并两个字典的常用方法与效率比较.分享给大家供大家参考.具体分析如下: 下面的代码举例了5种合并两个字典的方法,并且做了个简单的性能测试 #!/usr/bin/python import time def f1(d1, d2): return dict(d1, **d2) def f2(d1, d2): return dict(d1.items() + d2.items()) def f3(d1, d2): d = d1.copy() d.update(d2) retu

Python中实现两个字典(dict)合并的方法

本文实例讲述了Python中实现两个字典(dict)合并的方法,分享给大家供大家参考.具体方法如下: 现有两个字典dict如下: dict1={1:[1,11,111],2:[2,22,222]} dict2={3:[3,33,333],4:[4,44,444]} 合并两个字典得到类似: {1:[1,11,111],2:[2,22,222],3:[3,33,333],4:[4,44,444]} 方法1: dictMerged1=dict(dict1.items()+dict2.items())

Python合并字典键值并去除重复元素的实例

假设在python中有一字典如下: x={'a':'1,2,3', 'b':'2,3,4'} 需要合并为: x={'c':'1,2,3,4'} 需要做到三件事: 1. 将字符串转化为数值列表 2. 合并两个列表并添加新的键值 3. 去除重复元素 第1步通过常用的函数eval()就可以做到了,第2步需要添加一个键值并添加元素,第3步利用set集合的性质可以达到去重的效果,不过最后需要再将set集合转化为list列表.代码如下: x={'a':'1,2,3','b':'2,3,4'} x['c']=

Python中如何优雅的合并两个字典(dict)方法示例

前言 字典是Python中最强大的数据类型之一,本文将给大家详细介绍关于Python合并两个字典(dict)的相关内容,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍吧. 一行代码合并两个dict 假设有两个dict x和y,合并成一个新的dict,不改变 x和y的值,例如 x = {'a': 1, 'b': 2} y = {'b': 3, 'c': 4} 期望得到一个新的结果Z,如果key相同,则y覆盖x.期望的结果是 >>> z {'a': 1, 'b': 3, 'c':

在python中以相同顺序shuffle两个list的方法

通常做机器学习问题时,需要准备训练数据,通常会把样本数据和标签存放于2个list中,比如train_x = [x1,x2,...,xN][x1,x2,...,xN],train_y = [y1,y2,...,yN][y1,y2,...,yN]. 有时候是需要将数据shuffle后再做处理的(比如,批量梯度下降算法,需要数据是打乱的). 这时就需要以相同的顺序打乱两个list,那么在python中如何实现呢?可以通过设置相同的随机种子,再shuffle的方式来实现. 代码如下: import ra

用Python中的turtle模块画图两只小羊方法

这两天在一个公众号里看到好玩的turtle库,今天来学习一下. turtle.circle(radius, extent=None, steps=None) 描述: 以给定半径画圆 参数: radius(半径); 半径为正(负),表示圆心在画笔的左边(右边)画圆 extent(弧度) (optional); steps (optional) (做半径为radius的圆的内切正多边形,多边形边数为steps) radius > 0,逆时针画圆 radius < 0,顺时针画圆 extent &g

Python中list的交、并、差集获取方法示例

1. 获取两个list 的交集 # -*- coding=utf-8 -*- #方法一: a=[2,3,4,5] b=[2,5,8] tmp = [val for val in a if val in b] print tmp #[2, 5] #方法二 print list(set(a).intersection(set(b))) 2. 获取两个list 的并集 print list(set(a).union(set(b))) 3. 获取两个list 的差集 print list(set(b).

Python实现合并两个列表的方法分析

本文实例讲述了Python实现合并两个列表的方法.分享给大家供大家参考,具体如下: 浏览博客看到一个问题:如何合并两个列表,今天就来探讨一下. 方法一 最原始,最笨的方法,分别从两个列表中取出所有的元素,再放入新列表中就OK了.示例代码如下: list1 = [1,2,3] list2 = [4,5,6] list_new = [] for item in list1: list_new.append(item) for item in list2: list_new.append(item)

python实现合并两个数组的方法

本文实例讲述了python实现合并两个数组的方法.分享给大家供大家参考.具体如下: python合并两个数组,将两个数组连接成一个数组,例如,数组 a=[1,2,3] ,数组 b=[4,5,6],连接后:[1,2,3,4,5,6] 方法1 a=[1,2,3] b=[4,5,6] a=a+b 方法2 a=[1,2,3] b=[4,5,6] a.extend(b) 希望本文所述对大家的Python程序设计有所帮助.

python使用append合并两个数组的方法

本文实例讲述了python使用append合并两个数组的方法.分享给大家供大家参考.具体如下: lista = [1,2,3] listb = [4,5,6] mergedlist =[] for elem in lista: mergedlist.append(elem) for elem in listb: mergedlist.append(elem) 希望本文所述对大家的Python程序设计有所帮助.

Python中的is和==比较两个对象的两种方法

Python中的is和==比较两个对象的两种方法 在Python中有两种方式比较两个对象是否相等,分别是is和==,两者之间是不同的 ==比较的是值(如同java中的equals方法) is比较的是引用(可以看作比较内存地址, 类似于java中的==) 对于: >>> n = 1 >>> n is 1 True >>> b = '1' >>> b is 1 False >>> n == b False 由于1和'1'

基于Python中numpy数组的合并实例讲解

Python中numpy数组的合并有很多方法,如 - np.append() - np.concatenate() - np.stack() - np.hstack() - np.vstack() - np.dstack() 其中最泛用的是第一个和第二个.第一个可读性好,比较灵活,但是占内存大.第二个则没有内存占用大的问题. 方法一--append parameters introduction arr 待合并的数组的复制(特别主页是复制,所以要多耗费很多内存) values 用来合并到上述数组