簡體   English   中英

有沒有一種優雅的方法來合並以通過公共鍵合並字典列表?

[英]Is there an elegant way to merge to merge a list of dicts by a common key?

我正在尋找一種更優雅的方法來將此字典列表轉換為單個合並字典,其中鍵“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)')
]

所需的 output:

[
  {
      '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)

您可以使用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()]

Output:

[{'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)']}]

使用 pandas (假設 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')

Output -

[{'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}']}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM