首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
Coding
V2EX  ›  Python

Python 字典合并问题

  •  
  •   liuweicheng · 12 天前 · 1334 次点击
    要求把 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
        1
    vkhsyj   12 天前   ♥ 1
    一个思路,按照 name 进行 groupby,然后每个分组加起来
        2
    hutng   12 天前 via Android   ♥ 1
    笨办法:for 循环遍历
    聪明办法:不知道
        3
    yang3yen   12 天前   ♥ 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()
        4
    zhzy   12 天前 via iPhone   ♥ 1
    可以直接用==判断字典是否相同
        5
    di94sh   12 天前 via iPhone   ♥ 1
    Pandas group by 再 sum 和 sql 一样
        6
    widewing   12 天前 via Android   ♥ 1
    from itertools import groupby, reduce
        7
    di94sh   12 天前   ♥ 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))
    ```
        8
    yucongo   12 天前
    # 我来学习一下 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}]
        9
    Pzqqt   12 天前 via Android
    可以阅读这篇文章
    http://148.70.149.207/entry/6
        10
    ddzzhen   12 天前 via Android
    如果 name,value,package 都是一样的,不如换列表方便
        11
    pengdirect   12 天前 via iPhone
    python pandas 的透视函数可以帮到你
        12
    cy18   11 天前 via Android
    字典已经 O ( 1 )了,直接循环,又简单又快
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3218 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 31ms · UTC 10:25 · PVG 18:25 · LAX 02:25 · JFK 05:25
    ♥ Do have faith in what you're doing.