python - 有没有一种优雅的方法来合并以通过公共键合并字典列表?
问题描述
我正在寻找一种更优雅的方法来将此字典列表转换为单个合并字典,其中键“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)
解决方案
您可以使用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)']}]
推荐阅读
- python - 在 Python 中使用字典时收到错误
- cmake - 在特定配置(MinSizeRel、Release 等)上使用 target_link_libraries 而不是一般配置(优化或调试)?
- pycharm - 如何在 PyCharm 代码完成的开头显示字段?
- mongodb - 将 "$binary" : "r05rXSs5cUuEFQCujcuW6", "$type" : "03" 转换为来自 mongo db 的 UUID 格式
- php - 如何在删除帐户中删除用户的帖子?
- office-js - showHeaders=false 使用 Javascript 导致意外的表格范围
- ruby-on-rails - Active Record:如何一次从 3 个表中获取数据?
- android - ProgressBar 上不显示进度
- save - 如何在提交之前检查单独组件上的所有表单组是否有效。Angular 7,反应形式
- background-size - 如何使用anime.js v.3为背景大小的多个值设置动画