推荐学习书目
› 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 · Dec 1, 2019 · 5292 views
    This topic created in 2531 days ago, the information mentioned may be changed or developed.
    要求把 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 replies  •  2019-12-01 20:18:31 +08:00
    vkhsyj
    vkhsyj
    Dec 1, 2019❤️1
    1
    一个思路,按照 name 进行 groupby,然后每个分组加起来
    hutng
    hutng
    Dec 1, 2019 via Android❤️1
    2
    笨办法:for 循环遍历
    聪明办法:不知道
    yang3yen
    yang3yen
    Dec 1, 2019❤️1
    3
    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
    zhzy
    Dec 1, 2019 via iPhone❤️1
    4
    可以直接用==判断字典是否相同
    di94sh
    di94sh
    Dec 1, 2019 via iPhone❤️1
    5
    Pandas group by 再 sum 和 sql 一样
    widewing
    widewing
    Dec 1, 2019 via Android❤️1
    6
    from itertools import groupby, reduce
    di94sh
    di94sh
    Dec 1, 2019❤️1
    7
    ```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
    yucongo
    Dec 1, 2019
    8
    # 我来学习一下 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
    Pzqqt
    Dec 1, 2019 via Android
    9
    可以阅读这篇文章
    http://148.70.149.207/entry/6
    ddzzhen
    ddzzhen
    Dec 1, 2019 via Android
    10
    如果 name,value,package 都是一样的,不如换列表方便
    pengdirect
    pengdirect
    Dec 1, 2019 via iPhone
    11
    python pandas 的透视函数可以帮到你
    cy18
    cy18
    Dec 1, 2019 via Android
    12
    字典已经 O ( 1 )了,直接循环,又简单又快
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5214 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 71ms · UTC 01:27 · PVG 09:27 · LAX 17:27 · JFK 20:27
    ♥ Do have faith in what you're doing.