여러개의 딕셔너리안에서 어느 한 키의 value값이 같으면 그 딕셔너리들을 합치고 싶습니다.

[{'a': 567.0, 'inventory_code': 'SA100426'}, {'a': 1038.94, 'inventory_code': 'SA100426'}]

이러한 리스트 안의 딕셔너리들에서 inventory code의 값이 같으면 a값을 합쳐서 하나의 딕셔너리로 만들고 싶습니다.

[{'a': 1605.94, 'inventory_code': 'SA100426'} 이렇게요

3답변

  • 좋아요

    1

    싫어요
    채택취소하기
    inventory = [{'a': 567.0, 'inventory_code': 'SA100425'}, {
        'a': 1038.94, 'inventory_code': 'SA100426'}, {
        'a': 1038.94, 'inventory_code': 'SA100426'}, {
        'a': 1038.94, 'inventory_code': 'SA100428'}, {
        'a': 1038.94, 'inventory_code': 'SA100426'}]
    
    import itertools
    
    inventory = sorted(inventory, key=lambda x: x['inventory_code'])
    for _, v in itertools.groupby(inventory, lambda i:i['inventory_code']):
        items = list(v)
        first_item = items[0]
        first_item['a'] = sum(item['a'] for item in items)
        print(first_item)
    
    
    {'a': 567.0, 'inventory_code': 'SA100425'}
    {'a': 3116.82, 'inventory_code': 'SA100426'}
    {'a': 1038.94, 'inventory_code': 'SA100428'}
    
    
  • itertools 모듈을 사용해보세요.

    groupby 함수는 인접해있는 같은 것들을 하나로 묶어줍니다.

    inventory = [{'a': 567.0, 'inventory_code': 'SA100425'}, {
        'a': 1038.94, 'inventory_code': 'SA100426'}, {
        'a': 1038.94, 'inventory_code': 'SA100426'}, {
        'a': 1038.94, 'inventory_code': 'SA100428'}, {
        'a': 1038.94, 'inventory_code': 'SA100426'}]
    
    import itertools
    
    inventory = sorted(inventory, key=lambda x: x['inventory_code'])    # 소팅하여 같은 것들끼리 배열한다.
    for i, v in itertools.groupby(inventory, lambda i:i['inventory_code']):    # inventory_code 로 같은 것끼리 묶는다.
        print(list(v))
    
    
    [{'a': 567.0, 'inventory_code': 'SA100425'}]
    [{'a': 1038.94, 'inventory_code': 'SA100426'}, {'a': 1038.94, 'inventory_code': 'SA100426'}, {'a': 1038.94, 'inventory_code': 'SA100426'}]
    [{'a': 1038.94, 'inventory_code': 'SA100428'}]
    
    
    • 질문좀드려도될까요? 조홍제 2018.4.17 12:26
    • inventory_code가 같은놈들끼리는 a값을 합치고 싶습니다 안같으면 그대로 놔두구요 조홍제 2018.4.17 12:27
    • 단순히 보여지는게아니라 a값이 합쳐지면 좋겠습니다! inventory_code가 같으면요 조홍제 2018.4.17 12:30
    • inventory 값이 같으면 a 값을 더한다는 뜻인가요? 파이썬 유 2018.4.17 13:33
    • 네 맞습니다! 조홍제 2018.4.17 13:35
    • sum 작업이면 하면 됩니다만... 정영훈 2018.4.17 16:00
  • 요청하신 문제를 제대로 읽지 않았습니다. 다시 코드를 만들었습니다. 도움이 되시기를 ...inventory도 제가 약간 수정을 했네요. 문제가 되지 않겠지만요. 참고로 처음에 올린 코드는 완전 잘못된 것입니다.

    from collections import defaultdict
    inventory = [{'code': 25, 'amt': 3300}, {
        'code': 26, 'amt': 2990}, {'code': 26, 'amt': 1290}, {'code': 28, 'amt': 1990}, {'code': 26, 'amt': 3350}]
    
    c = defaultdict(int)
    
    for d in inventory:
        c[d['code']] += d['amt']
    
    new_inventory = [{'code': code, 'amt': amt} for code, amt in c.items()]
    print(new_inventory)
    

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.