我有三个类似的列表:
productData = [
{
'productId': 1000,
'productName': 'Product 1000'
},
{
'productId': 1001,
'productName': 'Product 1001'
}
]
stockData = [
{
'productId': 1000,
'locationId': 1,
'stock': 21
},
{
'productId': 1000,
'locationId': 2,
'stock': 8
},
{
'productId': 1001,
'locationId': 1,
'stock': 4
},
{
'productId': 1001,
'locationId': 2,
'stock': 10
}
]
locationData = [
{
'locationId': 1,
'locationName': 'Location 1'
},
{
'locationId': 2,
'locationName': 'Location 2'
}
]
我想根据productId和locationId合并它,所以它将如下所示:
result = [
{
productName: 'Product 1000',
stock: {
total: 29,
detail: [
{
locationName: 'Location 1',
stock: 21
},
{
locationName: 'Location 2',
stock: 8
}
]
}
},
{
productName: 'Product 1001',
stock: {
total: 14,
detail: [
{
locationName: 'Location 1',
stock: 4
},
{
locationName: 'Location 2',
stock: 10
}
]
}
}
]
我用ChainMap做了一些代码,但结果不是我所需要的, 以下是我的代码的结果:
[{'locationId': 1, 'locationName': 'Location 1', 'productId': 1000, 'stock': 21, 'productName': 'Product 1000'}, {'locationId': 2, 'locationName': 'Location 2'}]
首先我将productData和具有productId的stockData分组,然后根据结果将其与具有locationId的locationData分组,但结果是错误的, 你能告诉我我的密码有什么问题吗
grouped_subdicts = groupby(sorted(productData + stockData, key=itemgetter("productId")), itemgetter("productId"))
result = [dict(ChainMap(*g)) for k, g in grouped_subdicts]
grouped_subdicts_2 = groupby(sorted(result + locationData, key=itemgetter("locationId")), itemgetter("locationId"))
result_2 = [dict(ChainMap(*g)) for k, g in grouped_subdicts_2]
print(result_2)
与groupby不同,我使用了一种更简单的解决方案,只涉及
dict
和list
,因此您可以更好地控制您的上下文:我使用
make_product_entities
和make_location_entities
为产品和位置数据创建查找字典然后在
accumulate_product_data
中,我创建了那些查找字典,然后由于stock_data
是位置和产品之间的关联,我通过库存循环,对产品实体进行变异,然后在累积结束时,我只返回来自product_entities
字典的值试试看它是否适合你的问题
我会将所有三个列表转换为数据帧,然后使用groupby和pd.to_json获得最终结果
合并所有这些dfs以形成一个完整的数据框架,使用groupby和transform
如下所示:
然后使用groupby和来获得最终结果
结果:
相关问题 更多 >
编程相关推荐