问题描述
我正在寻找一种更优雅的方法来将这个 dicts 列表转换为单个合并的 dict ,并以键 'sku' 作为要合并的键。该列表实际上是很容易变成字典的 Pydantic 模型。我没有找到使用 Pydantic 的更优雅的解决方案。
dicts/pydanticinstances 列表
[a for a in m]
[
PackMapPydantic(id=60,pack_sku='PACKFAC01',sku='FAC01',prop_name='Facebook Username'),PackMapPydantic(id=61,sku='FAC02',PackMapPydantic(id=62,sku='FAC03',PackMapPydantic(id=63,sku='FAC05',PackMapPydantic(id=64,sku='FAC06',PackMapPydantic(id=70,prop_name='Channel Name'),PackMapPydantic(id=71,PackMapPydantic(id=72,PackMapPydantic(id=73,PackMapPydantic(id=74,PackMapPydantic(id=87,prop_name='__uk_avatar (direct link)'),PackMapPydantic(id=88,PackMapPydantic(id=89,PackMapPydantic(id=90,prop_name='__uk_avatar (direct link)')
]
所需的输出:
[
{
'sku': 'FAC05','prop_name': [
'Username','Channel'
]
},{
'sku': 'FAC01','Channel','__uk_avatar (direct link)'
]
},{
'sku': 'FAC06',{
'sku': 'FAC02',{
'sku': 'FAC03','__uk_avatar (direct link)'
]
}
]
目前的解决方案:
for sku in skus_distinct:
this_assets = []
for item in items_listed:
if item['sku'] == sku:
# item = list(item)
this_assets.append(item['prop_name'])
Now = {'sku': sku,'prop_name': this_assets }
print(Now)
解决方法
您可以使用collections.defaultdict
:
from collections import defaultdict
d = defaultdict(list)
for i in data:
d[i.sku].append(i.prop_name)
result = [{'sku':a,'prop_name':b} for a,b in d.items()]
输出:
[{'sku': 'FAC01','prop_name': ['Facebook Username','Channel Name','__uk_avatar (direct link)']},{'sku': 'FAC02',{'sku': 'FAC03',{'sku': 'FAC05','Channel Name']},{'sku': 'FAC06','__uk_avatar (direct link)']}]
,
使用熊猫(假设 dict1 是您的初始 dict 列表)-
import pandas as pd
df = pd.DataFrame(dict1)[['sku','prop_name']]
df = df.groupby('sku').agg({'prop_name': list}).reset_index()
result_dict = df.to_dict(orient='records')
输出 -
[{'sku': 'FAC01','__uk_avatar {direct link}']},'__uk_avatar {direct link}']}]