如何按item与date条件合并字典列表并格式化展示库存数据?
实现字典列表的条件合并与表格展示
需求背景
给定输入字典列表:
input = [ {'date':'2023-03-1', 'item':'i1', 'balance': 11, 'warehouse' : 'W1'}, {'date':'2023-03-2', 'item':'i1', 'balance': 12, 'warehouse' : 'W1'}, {'date':'2023-03-3', 'item':'i1', 'balance': 13, 'warehouse' : 'W1'}, {'date':'2023-04-2', 'item':'i2', 'balance': 11, 'warehouse' : 'W2'}, {'date':'2023-04-3', 'item':'i2', 'balance': 10, 'warehouse' : 'W2'}, {'date':'2023-03-3', 'item':'i1', 'balance': 10, 'warehouse' : 'W3'}, ]
需按查询条件 item='i1' and date='2023-03-3' 合并数据,生成如下格式的结果字典:
[{'date':'2023-03-3', 'item':'i1' , 'W1':13,'W2':0,'W3':10}]
最终将结果展示为表格:
| Date | item | W1 | W2 | W3 |
|---|---|---|---|---|
| 2023-03-3 | i1 | 13 | 0 | 10 |
实现方案
核心思路
- 先收集所有仓库名称,确保结果中包含所有仓库,无数据的仓库余额设为0
- 筛选符合查询条件的记录,填充对应仓库的余额
- 按需生成表格展示
Python代码实现
def merge_warehouse_data(input_data, target_item, target_date): # 提取所有存在的仓库 all_warehouses = {entry['warehouse'] for entry in input_data} # 初始化结果字典,设置基础字段和默认余额0 merged = { 'date': target_date, 'item': target_item } for warehouse in all_warehouses: merged[warehouse] = 0 # 遍历数据,更新符合条件的仓库余额 for entry in input_data: if entry['item'] == target_item and entry['date'] == target_date: merged[entry['warehouse']] = entry['balance'] return [merged] # 测试调用 input_data = [ {'date':'2023-03-1', 'item':'i1', 'balance': 11, 'warehouse' : 'W1'}, {'date':'2023-03-2', 'item':'i1', 'balance': 12, 'warehouse' : 'W1'}, {'date':'2023-03-3', 'item':'i1', 'balance': 13, 'warehouse' : 'W1'}, {'date':'2023-04-2', 'item':'i2', 'balance': 11, 'warehouse' : 'W2'}, {'date':'2023-04-3', 'item':'i2', 'balance': 10, 'warehouse' : 'W2'}, {'date':'2023-03-3', 'item':'i1', 'balance': 10, 'warehouse' : 'W3'}, ] # 执行合并 result = merge_warehouse_data(input_data, 'i1', '2023-03-3') print(result) # 输出期望的字典列表
生成表格展示
如果需要输出表格格式,可以使用tabulate库简化操作(先执行pip install tabulate安装):
from tabulate import tabulate # 提取表头和数据行 headers = ['Date', 'item'] + list({entry['warehouse'] for entry in input_data}) data_row = [result[0]['date'], result[0]['item']] + [result[0][wh] for wh in headers[2:]] # 打印表格 print(tabulate([data_row], headers=headers, tablefmt="pipe"))
执行后会直接输出符合要求的表格。
内容的提问来源于stack exchange,提问作者tree em
相关产品推荐
相关产品推荐

