首页 > 解决方案 > 有没有一种优雅的方法来合并以通过公共键合并字典列表?

问题描述

我正在寻找一种更优雅的方法来将此字典列表转换为单个合并字典,其中键“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, pack_sku='PACKFAC01', sku='FAC02', prop_name='Facebook Username'),
    PackMapPydantic(id=62, pack_sku='PACKFAC01', sku='FAC03', prop_name='Facebook Username'),
    PackMapPydantic(id=63, pack_sku='PACKFAC01', sku='FAC05', prop_name='Facebook Username'),
    PackMapPydantic(id=64, pack_sku='PACKFAC01', sku='FAC06', prop_name='Facebook Username'),
    PackMapPydantic(id=70, pack_sku='PACKFAC01', sku='FAC01', prop_name='Channel Name'),
    PackMapPydantic(id=71, pack_sku='PACKFAC01', sku='FAC02', prop_name='Channel Name'),
    PackMapPydantic(id=72, pack_sku='PACKFAC01', sku='FAC03', prop_name='Channel Name'),
    PackMapPydantic(id=73, pack_sku='PACKFAC01', sku='FAC05', prop_name='Channel Name'),
    PackMapPydantic(id=74, pack_sku='PACKFAC01', sku='FAC06', prop_name='Channel Name'),
    PackMapPydantic(id=87, pack_sku='PACKFAC01', sku='FAC01', prop_name='__uk_avatar (direct link)'),
    PackMapPydantic(id=88, pack_sku='PACKFAC01', sku='FAC02', prop_name='__uk_avatar (direct link)'),
    PackMapPydantic(id=89, pack_sku='PACKFAC01', sku='FAC03', prop_name='__uk_avatar (direct link)'),
    PackMapPydantic(id=90, pack_sku='PACKFAC01', sku='FAC06', prop_name='__uk_avatar (direct link)')
]

期望的输出:

[
  {
      'sku': 'FAC05', 
      'prop_name': [
          'Username', 
          'Channel'
      ]
  },
  {
      'sku': 'FAC01',
      'prop_name': [
          'Username',
          'Channel',
          '__uk_avatar (direct link)'
      ]
  },
  {
      'sku': 'FAC06',
      'prop_name': [
          'Username',
          'Channel',
          '__uk_avatar (direct link)'
      ]
  },
  {
      'sku': 'FAC02',
      'prop_name': [
          'Username',
          '__uk_avatar (direct link)'
      ]
  },
  {
      'sku': 'FAC03',
      'prop_name': [
          'Username',
          'Channel',
          '__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)

标签: pythondata-structurespydantic

解决方案


您可以使用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', 'prop_name': ['Facebook Username', 'Channel Name', '__uk_avatar (direct link)']}, {'sku': 'FAC03', 'prop_name': ['Facebook Username', 'Channel Name', '__uk_avatar (direct link)']}, {'sku': 'FAC05', 'prop_name': ['Facebook Username', 'Channel Name']}, {'sku': 'FAC06', 'prop_name': ['Facebook Username', 'Channel Name', '__uk_avatar (direct link)']}]

推荐阅读