Python 字典合并问题

2019-12-01 00:27:35 +08:00
 liuweicheng
要求把 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}]
3715 次点击
所在节点    Python
12 条回复
vkhsyj
2019-12-01 00:39:29 +08:00
一个思路,按照 name 进行 groupby,然后每个分组加起来
hutng
2019-12-01 00:41:01 +08:00
笨办法:for 循环遍历
聪明办法:不知道
yang3yen
2019-12-01 00:47:47 +08:00
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
2019-12-01 00:52:10 +08:00
可以直接用==判断字典是否相同
di94sh
2019-12-01 00:59:26 +08:00
Pandas group by 再 sum 和 sql 一样
widewing
2019-12-01 04:20:46 +08:00
from itertools import groupby, reduce
di94sh
2019-12-01 05:13:58 +08:00
```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
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
2019-12-01 11:09:34 +08:00
可以阅读这篇文章
http://148.70.149.207/entry/6
ddzzhen
2019-12-01 12:59:30 +08:00
如果 name,value,package 都是一样的,不如换列表方便
pengdirect
2019-12-01 17:55:24 +08:00
python pandas 的透视函数可以帮到你
cy18
2019-12-01 20:18:31 +08:00
字典已经 O ( 1 )了,直接循环,又简单又快

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/624698

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX