V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
liuweicheng
V2EX  ›  Python

Python 字典合并问题

  •  
  •   liuweicheng · 2019-12-01 00:27:35 +08:00 · 3927 次点击
    这是一个创建于 1849 天前的主题,其中的信息可能已经有所发展或是发生改变。
    要求把 name 相同的字典合并
    info = [{'name':'apple','value':2,'package':3},{'name':'orange','value':5,'package':4},{'name':'apple','value':5,'package':5}]

    输出:
    [{'name':'apple','value':7,'package':8},{'name':'orange','value':5,'package':4}]
    12 条回复    2019-12-01 20:18:31 +08:00
    vkhsyj
        1
    vkhsyj  
       2019-12-01 00:39:29 +08:00   ❤️ 1
    一个思路,按照 name 进行 groupby,然后每个分组加起来
    hutng
        2
    hutng  
       2019-12-01 00:41:01 +08:00 via Android   ❤️ 1
    笨办法:for 循环遍历
    聪明办法:不知道
    yang3yen
        3
    yang3yen  
       2019-12-01 00:47:47 +08:00   ❤️ 1
    info = [
    {'name': 'apple', 'value': 2, 'package': 3},
    {'name': 'orange', 'value': 5, 'package': 4},
    {'name': 'apple', 'value': 5, 'package': 5}
    ]

    # 要保持原来的顺序,可使用 collections.OrderedDict
    info_d = {}

    for v in info:
    if v['name'] not in info_d:
    info_d[v['name']] = v
    else:
    d = info_d[v['name']]
    d['value'] += v['value']
    d['package'] += v['package']

    info = info_d.values()
    zhzy
        4
    zhzy  
       2019-12-01 00:52:10 +08:00 via iPhone   ❤️ 1
    可以直接用==判断字典是否相同
    di94sh
        5
    di94sh  
       2019-12-01 00:59:26 +08:00 via iPhone   ❤️ 1
    Pandas group by 再 sum 和 sql 一样
    widewing
        6
    widewing  
       2019-12-01 04:20:46 +08:00 via Android   ❤️ 1
    from itertools import groupby, reduce
    di94sh
        7
    di94sh  
       2019-12-01 05:13:58 +08:00   ❤️ 1
    ```python
    import pandas as pd

    rows = [{'name': 'apple', 'value': 2, 'package': 3}, {'name': 'orange', 'value': 5, 'package': 4}, {'name': 'apple', 'value': 5, 'package': 5}]

    df = pd.DataFrame(rows)

    s = df.groupby('name', as_index=False).agg({'value': 'sum', 'package': 'sum'})
    l = s.T.to_dict().values()
    print(list(l))
    ```
    yucongo
        8
    yucongo  
       2019-12-01 11:02:12 +08:00
    # 我来学习一下 groupby 的用法

    import numpy as np
    from itertools import groupby

    info = [{'name':'apple','value':2,'package':3},{'name':'orange','value':5,'package':4},{'name':'apple','value':5,'package':5}]

    lst = [[key, [*np.asarray([[*elm.values()][1:] for elm in group]).sum(axis=0)]] for key, group in groupby(sorted(info, key=lambda x: x.get('name')), lambda x: x.get('name'))]
    # ->[['apple', [7, 8]], ['orange', [5, 4]]]

    [{**dict(zip([*info[0].keys()][:1], elm[:1])), **dict(zip([*info[0].keys()][1:], elm[1:][0]))} for elm in lst]
    # ->[{'name': 'apple', 'value': 7, 'package': 8}, {'name': 'orange', 'value': 5, 'package': 4}]
    Pzqqt
        9
    Pzqqt  
       2019-12-01 11:09:34 +08:00 via Android
    可以阅读这篇文章
    http://148.70.149.207/entry/6
    ddzzhen
        10
    ddzzhen  
       2019-12-01 12:59:30 +08:00 via Android
    如果 name,value,package 都是一样的,不如换列表方便
    pengdirect
        11
    pengdirect  
       2019-12-01 17:55:24 +08:00 via iPhone
    python pandas 的透视函数可以帮到你
    cy18
        12
    cy18  
       2019-12-01 20:18:31 +08:00 via Android
    字典已经 O ( 1 )了,直接循环,又简单又快
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1606 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:29 · PVG 00:29 · LAX 08:29 · JFK 11:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.