【问题标题】:nest dictionary list to another dictionary list based on key using comprehension list使用理解列表基于键将字典列表嵌套到另一个字典列表
【发布时间】:2020-05-07 19:07:11
【问题描述】:

我正在尝试使用理解列表将一个字典列表嵌套到另一个字典列表,我有两个字典列表,一个是类别,另一个是油。如果 oils category_id 等于 category id,则将 list oils 的结果添加到每个类别中。

def nest(parent, child):
    items = []
    for element in child:
        if element.get('category_id') == parent.get('id'):
            items.append(element)
        parent.update({'items': items})
    return parent

def merge(parent, child):
    results = []
    for element in parent:
        results.append(nest(element, child))
    return results


categories = [
    {'id': 1000, 'name': 'Single'},
    {'id': 2000, 'name': 'Blend'}]

oils = [
    {'id': 100, 'name': 'Orange', 'category_id': 1000},
    {'id': 101, 'name': 'Lavender', 'category_id': 1000},
    {'id': 102, 'name': 'Peppermint', 'category_id': 1000},
    {'id': 104, 'name': 'Inspired', 'category_id': 2000},
    {'id': 105, 'name': 'Focus', 'category_id': 2000},
    {'id': 107, 'name': 'Tea Tree', 'category_id': 1000}]

results = merge(categories, oils)

print(results)
# output:
# [
#     {'id': 1000, 'name': 'Single', 'items': [
#         {'id': 100, 'name': 'Orange', 'category_id': 1000}, 
#         {'id': 101, 'name': 'Lavender', 'category_id': 1000}, 
#         {'id': 102, 'name': 'Peppermint', 'category_id': 1000}, 
#         {'id': 107, 'name': 'Tea Tree', 'category_id': 1000}
#     ]}, 
#     {'id': 2000, 'name': 'Blend', 'items': [
#         {'id': 104, 'name': 'Inspired', 'category_id': 2000}, 
#         {'id': 105, 'name': 'Focus', 'category_id': 2000}
#     ]}
# ]

我正在尝试将以上内容转换为理解列表,但没有成功

merged = [
    element.update({'items': nest}) for nest in oils
    for element in categories if element.get('id') == nest.get('category_id')
]

print(merged)
# output: [None, None, None, None, None, None]

【问题讨论】:

    标签: python-3.x list dictionary list-comprehension dictionary-comprehension


    【解决方案1】:
    merged = [dict(**c, items=[o for o in oils if o['category_id'] == c['id']]) for c in categories]
    
    from pprint import pprint
    pprint(merged)
    

    打印:

    [{'id': 1000,
      'items': [{'category_id': 1000, 'id': 100, 'name': 'Orange'},
                {'category_id': 1000, 'id': 101, 'name': 'Lavender'},
                {'category_id': 1000, 'id': 102, 'name': 'Peppermint'},
                {'category_id': 1000, 'id': 107, 'name': 'Tea Tree'}],
      'name': 'Single'},
     {'id': 2000,
      'items': [{'category_id': 2000, 'id': 104, 'name': 'Inspired'},
                {'category_id': 2000, 'id': 105, 'name': 'Focus'}],
      'name': 'Blend'}]
    

    编辑(添加动态变量):

    variable = 'elements' # this is your dynamic variable
    merged = [dict(**c, **{variable: [o for o in oils if o['category_id'] == c['id']]}) for c in categories]
    

    【讨论】:

    • 你知道我怎样才能使items key 动态化吗?我会说项目可能是元素?谢谢。
    • @mariohbrino 你可以做dict(**c, elements=[..]) 或者我现在在我的答案中提出的解决方案。
    • 另一个解决方案是我正在寻找的。谢谢。
    【解决方案2】:

    我想它作为一个简单的函数会很好。谢谢。

    def merge(parent, child, nested='nested', key='id', foreign='parent_id'):
        return [
            dict(**element, **{nested: [nest for nest in child if nest[foreign] == element[key]]})
            for element in parent
        ]
    

    【讨论】:

      猜你喜欢
      • 2021-06-08
      • 1970-01-01
      • 2022-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      相关资源
      最近更新 更多