Python 列表:对列表中的值求和并删除重复项
Python list: Sum values on list and remove duplicates
我在 Python 中有以下列表:
my_list = [{'code_id': 'A', 'amount': 100.0},{'code_id': 'B', 'amount': 150.0},{'code_id': 'C', 'amount': 200.0},{'code_id': 'A', 'amount': 120.0},{'code_id': 'B', 'amount': 300.0},{'code_id': 'D', 'amount': 180.0}]
从上面的列表中,我需要创建一个没有重复的新列表;但将上面列表中所有项目的“数量”相加。
我需要得到一个像这样的最终列表:
final_list = [{'code_id': 'A', 'amount': 220.0},{'code_id': 'B', 'amount': 450.0},{'code_id': 'C', 'amount': 200.0},{'code_id': 'D', 'amount': 180.0}]
我能够删除重复项,但不知道如何在此过程中对值求和。我用过的示例代码:
final_list = []
seen = set()
for dic in my_list:
key = (dic['code_id'])
if key in seen:
continue
final_list.append(dic)
seen.add(key)
如何在 Python 中实现此目的?
我将从一个临时的 defaultdict
开始,它跟踪每个 'code_id'
:
的 'amount'
from collections import defaultdict
my_list = [{'code_id': 'A', 'amount': 100.0},{'code_id': 'B', 'amount': 150.0},{'code_id': 'C', 'amount': 200.0}, {'code_id': 'A', 'amount': 120.0},{'code_id': 'B', 'amount': 300.0},{'code_id': 'D', 'amount': 180.0}]
tmp = defaultdict(int)
for d in my_list:
tmp[d['code_id']] += d['amount']
# if tmp was a normal dict, you could use
# tmp[d['code_id']] = tmp.get(d['code_id'], 0) + d['amount']
print(tmp)
# defaultdict(int, {'A': 220.0, 'B': 450.0, 'C': 200.0, 'D': 180.0})
...然后对tmp
的结构进行改造,得到想要的结果
result = [{'code_id': k, 'amount': v} for k, v in tmp.items()]
print(result)
# [{'code_id': 'A', 'amount': 220.0}, {'code_id': 'B', 'amount': 450.0}, {'code_id': 'C', 'amount': 200.0}, {'code_id': 'D', 'amount': 180.0}]
pandas
用户:
>>> pd.DataFrame(my_list).groupby('code_id', as_index=False).sum().to_dict(orient='records')
[{'code_id': 'A', 'amount': 220.0},
{'code_id': 'B', 'amount': 450.0},
{'code_id': 'C', 'amount': 200.0},
{'code_id': 'D', 'amount': 180.0}]
我在 Python 中有以下列表:
my_list = [{'code_id': 'A', 'amount': 100.0},{'code_id': 'B', 'amount': 150.0},{'code_id': 'C', 'amount': 200.0},{'code_id': 'A', 'amount': 120.0},{'code_id': 'B', 'amount': 300.0},{'code_id': 'D', 'amount': 180.0}]
从上面的列表中,我需要创建一个没有重复的新列表;但将上面列表中所有项目的“数量”相加。
我需要得到一个像这样的最终列表:
final_list = [{'code_id': 'A', 'amount': 220.0},{'code_id': 'B', 'amount': 450.0},{'code_id': 'C', 'amount': 200.0},{'code_id': 'D', 'amount': 180.0}]
我能够删除重复项,但不知道如何在此过程中对值求和。我用过的示例代码:
final_list = []
seen = set()
for dic in my_list:
key = (dic['code_id'])
if key in seen:
continue
final_list.append(dic)
seen.add(key)
如何在 Python 中实现此目的?
我将从一个临时的 defaultdict
开始,它跟踪每个 'code_id'
:
'amount'
from collections import defaultdict
my_list = [{'code_id': 'A', 'amount': 100.0},{'code_id': 'B', 'amount': 150.0},{'code_id': 'C', 'amount': 200.0}, {'code_id': 'A', 'amount': 120.0},{'code_id': 'B', 'amount': 300.0},{'code_id': 'D', 'amount': 180.0}]
tmp = defaultdict(int)
for d in my_list:
tmp[d['code_id']] += d['amount']
# if tmp was a normal dict, you could use
# tmp[d['code_id']] = tmp.get(d['code_id'], 0) + d['amount']
print(tmp)
# defaultdict(int, {'A': 220.0, 'B': 450.0, 'C': 200.0, 'D': 180.0})
...然后对tmp
的结构进行改造,得到想要的结果
result = [{'code_id': k, 'amount': v} for k, v in tmp.items()]
print(result)
# [{'code_id': 'A', 'amount': 220.0}, {'code_id': 'B', 'amount': 450.0}, {'code_id': 'C', 'amount': 200.0}, {'code_id': 'D', 'amount': 180.0}]
pandas
用户:
>>> pd.DataFrame(my_list).groupby('code_id', as_index=False).sum().to_dict(orient='records')
[{'code_id': 'A', 'amount': 220.0},
{'code_id': 'B', 'amount': 450.0},
{'code_id': 'C', 'amount': 200.0},
{'code_id': 'D', 'amount': 180.0}]