вложить список словарей в другой список словарей на основе ключа, используя список понимания - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь использовать список понимания, чтобы вложить один список словарей в другой список словарей, у меня есть два списка словарей, один - категории, а другой - масла. Добавьте результат списка масел в каждую категорию, если масла category_id равны идентификатору категории.

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]

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Думаю, было бы неплохо как простая функция. Спасибо.

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
    ]
0 голосов
/ 07 мая 2020
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'}]

EDIT (для добавления динамической c переменной):

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]
...