python(jython 2.7) 에서 list-dict 타입 같은 키 값끼리 count 또는 sum 하는 방법이 있을까요?

조회수 388회

저번에 list-dict 형태의 데이터에서 같은 value끼리 묶어서 카운트하는 방법 질문 드렸었는데 반대로 같은 키값 여러개를 카운트 시키려면 어떻게 해야할까요? 참고로 자이썬 2.7 에서는 **가먹질 않네요..

origin = [
    { 'pk':'1', 'a':1, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'},
    { 'pk':'1', 'a':0, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'},
    { 'pk':'1', 'a':1, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'},
    { 'pk':'1', 'a':0, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'},
    { 'pk':'1', 'a':1, 'b':2, 'c':0, 'd':0, 'e':1 , 'date':'20210308'},
    { 'pk':'2', 'a':0, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'},
    { 'pk':'2', 'a':0, 'b':0, 'c':0, 'd':0, 'e':0 , 'date':'20210308'},
]

희망 결과>
[
    { 'pk':'1', 'a':3, 'b':2, 'c':0, 'd':0, 'e':5 , 'date':'20210308'},
    { 'pk':'2', 'a':0, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'}
]

3 답변

  • pandas groupby 로 하는 게 가장 간단한 방법입니다. 단, 지난 질문에서도 pandas 는 못쓴다고 했던 것 같아서...

    그냥 같은 방식으로 하면 됩니다.

    테이블형태로 컬럼명이 일정한 데이터라고 가정하겠습니다.

    from pprint import pprint
    
    origin = [
        {"pk": "1", "a": 1, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"},
        {"pk": "1", "a": 0, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"},
        {"pk": "1", "a": 1, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"},
        {"pk": "1", "a": 0, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"},
        {"pk": "1", "a": 1, "b": 2, "c": 0, "d": 0, "e": 1, "date": "20210308"},
        {"pk": "2", "a": 0, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"},
        {"pk": "2", "a": 0, "b": 0, "c": 0, "d": 0, "e": 0, "date": "20210308"},
    ]
    
    sum_dict: dict = {}
    columns = ["a", "b", "c", "d", "e"]
    
    for dat in origin:
        sum_ = sum_dict.get(dat["pk"], {col: 0 for col in columns})
        sum_ = {col: sum_[col] + dat[col] for col in columns}
        sum_dict[dat["pk"]] = sum_
    
    pprint(sum_dict)
    
    # {'1': {'a': 3, 'b': 2, 'c': 0, 'd': 0, 'e': 5},
    #  '2': {'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 1}}
    
    res = []
    for key, val in sum_dict.items():
        r = {"pk": key}
        r.update(val)
        res.append(r)
    
    pprint(res)
    
    # [{'a': 3, 'b': 2, 'c': 0, 'd': 0, 'e': 5, 'pk': '1'},
    #  {'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 1, 'pk': '2'}]
    
  • 스탠다드 모듈에 groupby 가 구현되어 있습니다.

    origin = [
        {"pk": "1", "a": 1, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"},
        {"pk": "1", "a": 0, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"},
        {"pk": "1", "a": 1, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"},
        {"pk": "1", "a": 0, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"},
        {"pk": "1", "a": 1, "b": 2, "c": 0, "d": 0, "e": 1, "date": "20210308"},
        {"pk": "2", "a": 0, "b": 0, "c": 0, "d": 0, "e": 1, "date": "20210308"},
        {"pk": "2", "a": 0, "b": 0, "c": 0, "d": 0, "e": 0, "date": "20210308"},
    ]
    
    import itertools as it
    from functools import reduce
    import operator as op
    
    [{'pk':key[0], 
      **reduce(lambda a, b: {k: a[k] + b[k] for k in a if k not in ['pk', 'date']}, grouped),
      'date':key[1]}  
     for key, grouped in it.groupby(origin, op.itemgetter('pk', 'date'))]
    
    [{'pk': '1', 'a': 3, 'b': 2, 'c': 0, 'd': 0, 'e': 5, 'date': '20210308'},
     {'pk': '2', 'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 1, 'date': '20210308'}]
    
  • 값이 고정이라면 이런 방식으로 진행할 수 있지 않을까요?

    origin = [
        { 'pk':'1', 'a':1, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'},
        { 'pk':'1', 'a':0, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'},
        { 'pk':'1', 'a':1, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'},
        { 'pk':'1', 'a':0, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'},
        { 'pk':'1', 'a':1, 'b':2, 'c':0, 'd':0, 'e':1 , 'date':'20210308'},
        { 'pk':'2', 'a':0, 'b':0, 'c':0, 'd':0, 'e':1 , 'date':'20210308'},
        { 'pk':'2', 'a':0, 'b':0, 'c':0, 'd':0, 'e':0 , 'date':'20210308'},
    ]
    
    f = []
    for i in origin:
        pk = i['pk']
        if pk not in f:
            f.append(pk)
    
    g = []
    for i in f:
       h = {'pk':i, 'a':0, 'b':0, 'c':0, 'd':0, 'e':0}
        for j in origin:
            if j['pk'] == i:
                h['a'] += j['a']
                h['b'] += j['b']
                h['c'] += j['c']
                h['d'] += j['d']
                h['e'] += j['e']
        g.append(h)
    
    print(g)
    >> [{'pk': '1', 'a': 3, 'b': 2, 'c': 0, 'd': 0, 'e': 5}, {'pk': '2', 'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 1}]
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)