使用Python 3.7和不使用Panda聚合为字典列表的平均值、最小值和最大值



我有以下数据

data = [{'item': 'A', 'price': '$52'},
{'item': 'B', 'price': '$21'},
{'item': 'C', 'price': '$35'},
{'item': 'A', 'price': '$52'},
{'item': 'A', 'price': '$52'},
{'item': 'B', 'price': '$21'}]

如何在不使用panda和仅使用python 3的情况下聚合项目A、B和C+感谢任何能在这里帮助我的链接。

预期输出为

A $156
B $42
C $35

我已经尝试了以下代码:

for key, group in itertools.groupby(sorted_data, lambda item: item['item']):
print(key, sum([item["item"] for item in group]))

我得到以下错误:

TypeError: unsupported operand type(s) for +: 'int' and 'str'

有没有更简单的解决方案:

from collections import defaultdict
data = [
{"item": "A", "price": "$52"},
{"item": "B", "price": "$21"},
{"item": "C", "price": "$35"},
{"item": "A", "price": "$52"},
{"item": "A", "price": "$52"},
{"item": "B", "price": "$21"},
]
result = defaultdict(list)
for d in data:
result[d["item"]].append(d["price"])
result = {key: f"${sum(int(v[1:]) for v in value)}" for key, value in result.items()}
print(result)

输出:

{'A': '$156', 'B': '$42', 'C': '$35'}
  1. 您正在尝试求和item,而不是price

  2. price是一个以'$'开头的字符串,所以你不能指望sum会神奇地处理它(即,删除'$',将其余部分相加为数字,然后在完成后加上'$'(。

最简单的解决方案是手动剥去price的第一个字符,使用sum,然后在打印时再次准备$

def key_func(d):
return d['item']
for key, group in itertools.groupby(sorted(data, key=key_func), key=key_func):
print(key, '$' + str(sum(int(item['price'].lstrip('$')) for item in group)))

输出

A $156
B $42
C $35

最新更新