How to find shared keys in dicts list and sort them by value?

I want to create finalDic that contains shared keys and the sum of their values

myDic = [{2:1, 3:1, 5:2}, {3:4, 6:4, 2:3}, {2:5, 3:6}, ...] 

First find the common keys

 commonkey = [{2:1, 3:1}, {2:3, 3:4}, {2:5, 3:6}] 

Then we summarize and sort by their values

 finalDic= {3:11, 2,9} 

I tried this and don’t even close what I want

 import collections myDic = [{2:1, 3:1, 5:2}, {3:4, 6:4, 2:3}, {2:5, 3:6}] def commonKey(x): i=0 allKeys = [] while i<len(x): for key in x[0].keys(): allKeys.append(key) i=i+1 commonKeys = collections.Counter(allKeys) commonKeys = [i for i in commonKeys if commonKeys[i]>len(x)-1] return commonKeys print commonKey(myDic) 

thanks

+4
source share
4 answers

Here's how I would do it:

 my_dict = [{2:1, 3:1, 5:2}, {3:4, 6:4, 2:3}, {2:5, 3:6}] # Finds the common keys common_keys = set.intersection(*map(set, my_dict)) # Makes a new dict with only those keys and sums the values into another dict summed_dict = {key: sum(d[key] for d in my_dict) for key in common_keys} 

Or like crazy single line:

 {k: sum(d[k] for d in my_dict) for k in reduce(set.intersection, map(set, my_dict))} 
+7
source

Only some pointers:

  • get the keys from each directory, in turn, into the set () and calculate the intersection () or all sets of keys. This will give you shared keys.
  • now iterates the source data and sums the corresponding values ​​from each dict straightforwardly

Implementation remains in the OP as an exercise.

+2
source
 l = [{2:1, 3:1, 5:2}, {3:4, 6:4, 2:3}, {2:5, 3:6}] new_dict = {} def unique_key_value(a,b): return set(a).intersection(set(b)) def dict_sum(k, v): if k not in new_dict.keys(): new_dict[k] = v else: new_dict[k] = new_dict[k] + v for i in reduce(unique_key_value, l): for k in l: if i in k.keys(): dict_sum(i, k[i]) print new_dict 

hope this helps. :)

+1
source

python 3.2

 from collections import defaultdict c=defaultdict(list) for i in myDic: for m,n in i.items(): c[m].append(n) new_dic={i:sum(v) for i,v in c.items()if len(v)==len(myDic)} print(new_dic) 
+1
source

All Articles