舉例講解Python中字典的合并值相加與異或對比
字典合并值相加
在統(tǒng)計匯總游戲數(shù)據(jù)的時候,有些數(shù)據(jù)是是每天用字典存的,當我要對多天匯總的時候,就需要合并字典了。
如果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()函數(shù)也有"鮮為人知的參數(shù)",即第2個參數(shù),start參數(shù),默認是0。
而且不止可以是int類型,還可以是其他支持+操作符的東西,比如[]。
利用這一點,可以對二層數(shù)組打平成一層。
比如
>>sum([[1,2,3],[4,5]],[]) [1,2,3,4,5]
對字典diff("異或")
在游戲中,我要監(jiān)控記錄物品系統(tǒng)中的背包變動情況。("異或"的結果是相同的消除,剩下不同的,即變動的)
假設背包的存儲結構是這樣的。
是一個字典,{物品id:數(shù)量}。
在背包類初始化的時候,把背包物品信息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如何根據(jù)時間序列數(shù)據(jù)作圖
這篇文章主要介紹了Python如何根據(jù)時間序列數(shù)據(jù)作圖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-05-05
Python數(shù)據(jù)處理之pd.Series()函數(shù)的基本使用
Series是帶標簽的一維數(shù)組,可存儲整數(shù)、浮點數(shù)、字符串、Python 對象等類型的數(shù)據(jù),軸標簽統(tǒng)稱為索引,下面這篇文章主要給大家介紹了關于Python數(shù)據(jù)處理之pd.Series()函數(shù)的基本使用,需要的朋友可以參考下2022-06-06
使用Python3?Boto3包刪除AWS?CloudFormation的棧(Stacks)
這篇文章主要介紹了如何使用Python3?Boto3刪除AWS?CloudFormation的棧(Stacks),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-01-01
Django博客系統(tǒng)注冊之創(chuàng)建用戶模塊應用
本文主要介紹了Django博客系統(tǒng)注冊之創(chuàng)建用戶模塊應用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09

