2013-02-17 5 views
0

의 중복에 합계 값은 내가 좋아하는 사전의 목록을 가지고 그 :파이썬 2.7 사전

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

해결책을 인식하지 못했습니다. 모든 포인터에 대해 대단히 고마워.

그런 다음, 카운트를 축적 목록에 다시 밀어하기 위해 2tuple와 defaultdict을 사용할 수 있습니다

답변

3

...

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

그건 작동합니다. 매우 감사합니다. – JMcClure

0

또 다른 해결책, GROUPBY 및 목록, 딕셔너리와 발전기 함축 사용 :

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'}] 

설명 :

  • 그룹화 기능 항목을 취해 서브 딕셔너리 0을 반환'dict-comprehension'을 사용하는 'count'항목이 없습니다.
  • 그런 다음 groupby는 동일한 하위 그룹이있는 모든 원래 목록 항목을 수집합니다.
  • 마지막으로 목록 이해는 해당 그룹 및 합계 (이제 생성자 사용을 사용)에서 반복 항목을 반복합니다.

단점 :

  • 덜 읽을 수 있습니다.
  • groupby를 작동 시키려면 정렬이 필요하므로 작업 속도가 느려질 수 있습니다.

장점은 :

  • 목록 1은 이미 아마 빠른 분류됩니다. (왜냐하면 일반적으로 파이썬에서는 보급이 더 빠름)
  • 더 짧습니다. (심지어 단 하나의 간신히 이해할 수있는 라인에 쓸 수 있습니다 :))