是否有一种优雅的方法来合并以通过公共键合并字典列表?

问题描述

我正在寻找一种更优雅的方法来将这个 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}']}]