Home >Backend Development >Python Tutorial >Addition and XOR comparison of merged values ​​of dictionaries in Python

Addition and XOR comparison of merged values ​​of dictionaries in Python

高洛峰
高洛峰Original
2017-03-03 15:18:261740browse

Add dictionary merged values

When statistically summarizing game data, some data are stored in dictionaries every day. When I want to summarize multiple days , you need to merge dictionaries.
If the keys are the same, their values ​​are added.
You cannot use the update method, because if you use the update method, the values ​​of the same key will be overwritten instead of added.
A thousand words are worth a yard.

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)


Output

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

sum( [obj.keys() for obj in objs],[]) This sentence may not be easy to understand.
In fact, the sum() function also has "little-known parameters", that is, the second parameter, the start parameter, which defaults to 0.
And it can not only be of int type, but also other things that support the + operator, such as [].
Using this, the two-layer array can be flattened into one layer.
For example

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

Dictionary diff("XOR")
In the game, I want Monitor and record backpack changes in the item system. (The result of "XOR" is that the same ones are eliminated, and the remaining ones are different, that is, changed)
Assume that the storage structure of the backpack is like this.
is a dictionary, {item id: quantity}.
When the backpack class is initialized, copy the backpack item information to an oldbag variable. After performing some item operations (such as using items, receiving item rewards, etc.), when calling the save() method to save it into redis, the new Compare the differences between the bag dictionary and the oldbag dictionary to get the changes.
A thousand words are worth a yard.

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)

Output

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

means the player got 1 'b' items, 4 'd' items, and 3 'c' items lost.

For more articles related to the addition and XOR comparison of merged values ​​of dictionaries in Python, please pay attention to the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn