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' 且 date ='2023-03-3'
我想要这样的放置:
[{'date':'2023-03-3', 'item':'i1' , 'W1':13,'W2':0: W2:10}]
目标是以以下格式显示:
Date | item | W1 | W2 | W3
2023-03-3 | i1 | 13 | 0 | 10
最佳答案
如果您有权访问 pandas 库,则可以使用数据透视表来获取您要查找的内容。
import pandas as pd
df = pd.DataFrame(inputs)
pivot = df.pivot_table(index=['date', 'item'], columns='warehouse', fill_value=0).reset_index(level=(0,1), col_level=1)
pivot
pivot.columns = pivot.columns.droplevel(0)
pivot.to_dict('records')
# returns:
[{'date':'2023-03-1', 'item':'i1', 'W1': 11, 'W2':0, 'W3': 0},
{'date':'2023-03-2', 'item':'i1', 'W1': 12, 'W2':0, 'W3': 0},
{'date':'2023-03-3', 'item':'i1', 'W1': 13, 'W2':0, 'W3': 10},
{'date':'2023-04-2', 'item':'i2', 'W1': 0, 'W2':11, 'W3': 0},
{'date':'2023-04-3', 'item':'i2', 'W1': 0, 'W2':10, 'W3': 0}]
如果您不想使用 pandas,您可以使用脚本旋转数据:
pivot = {}
warehouses = set()
for d in inputs:
k1 = d['date']
k2 = d['item']
w = d['warehouse']
c = d['balance']
warehouses.add(w)
counts = pivot.setdefault((k1, k2), {})
counts[w] = c
records = [{'date': k1, 'item': k2
然后显示它:
for (k1, k2) in sorted(pivot):
counts = pivot[(k1, k2)]
ws = ' | '.join(str(counts.get(w, 0)) for w in sorted(warehouses))
print(f'{k1} | {k2} | {ws}')
# prints:
2023-03-1 | i1 | 11 | 0 | 0
2023-03-2 | i1 | 12 | 0 | 0
2023-03-3 | i1 | 13 | 0 | 10
2023-04-2 | i2 | 0 | 11 | 0
2023-04-3 | i2 | 0 | 10 | 0
关于python - 如果有某些条件匹配,则合并字典列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75888185/