2013-02-17 4 views
0

J'ai une liste de dictionnaires comme:Python 2.7 - Valeur Somme sur doublons dans le dictionnaire

list1=[{'a':'apples', 'b':'snack','count':2},{'a':'apples','b':'lunch','count':3},{'a':'apples','b':'snack','count':3}] 

J'ai besoin de doublons de groupe dans la liste « a » et « b » et la somme de leur « count » tels :

list2=[{'a':'apples','b':'snack','count':5},{'a':'apples','b':'lunch','count':3}] 

Recherche dans le référentiel ici et n'a pas reconnu de solution. Merci beaucoup pour les conseils.

Répondre

3

Vous pouvez utiliser un defaultdict avec un 2tuple d'accumuler les comptes, puis repoussez à une liste ...

list1=[{'a':'apples', 'b':'snack','count':2},{'a':'apples','b':'lunch','count':3},{'a':'apples','b':'snack','count':3}] 

from collections import defaultdict 
dd = defaultdict(int) 
for d in list1: 
    dd[d['a'], d['b']] += d['count'] 

list2 = [{'a': k[0], 'b': k[1], 'count': v} for k, v in dd.iteritems()] 

[{'a': 'apples', 'count': 3, 'b': 'lunch'}, {'a': 'apples', 'count': 5, 'b': 'snack'}] 
+0

Cela fonctionne. Merci beaucoup. – JMcClure

0

Une autre solution, en utilisant groupby et la liste, dict et générateur compréhensions:

list1=[{'a':'apples', 'b':'snack','count':2},{'a':'apples','b':'lunch','count':3},{'a':'apples','b':'snack','count':3}] 

from itertools import groupby 
list1.sort() 
group_func = lambda x: {key:val for key, val in x.iteritems() if key!='count'} 
list2 = [dict(k, count = sum(item['count'] for item in items)) for k, items in groupby(list1, group_func)] 

[{'a': 'apples', 'count': 3, 'b': 'lunch'}, {'a': 'apples', 'count': 5, 'b': 'snack'}] 

Explication:

  • La fonction mérou prend un élément et retourner un sous-dictionnaire sans l'élément 'count' en utilisant dict-compréhension.
  • Puis groupby rassemble tous les éléments de la liste d'origine avec le même sous-champ
  • Enfin, la compréhension de la liste itère les groupes et les sommes (maintenant en utilisant la compréhension du générateur) les éléments de comptage.

Moins:

  • moins lisible.
  • Pour que groupby fonctionne, il doit être trié, ce qui peut ralentir les choses.

Plus:

  • Si list1 est déjà ce qui est probablement triés plus rapide. (puisque les compréhensions sont généralement plus rapides en python)
  • Shorter. (peut même être écrit dans une seule ligne à peine compréhensible :))