Как получить значения из списка словарей и добавить - PullRequest
0 голосов
/ 05 августа 2020
  • У меня много employeeid s, как показано ниже.

  • Мне нужно получить значение для названия компании и добавить его к list.

  • Мне нужно получить политики значений и добавить их в список после проверки parent.

  • , если родительский Marketing имя должно быть добавлено к уровню 1.

  • , если родитель - Advertising имя необходимо добавить к уровню 2.

  • , если в каком-то месте Бизнес - [ ] Мне нужно передать None вместо Null List

  • Также необходимо проверить, существует ли ключ, для некоторых ключей есть вероятность отсутствия policies, business

    test = [{"id":"100","name":"A",
    "Business":[{"id":"7","name":"Enterprise"},
    {"id":"8","name":"Customer"}],
    "policies":[{"id":"332","name":"Second division","parent":"Marketing"},
    {"id":"3323","name":"First division","parent":"Marketing"}]},
    {"id":"101","name":"B",
    "Business":[{"id":"7","name":"Enterprise"},
    {"id":"8","name":"Customer"}],
    "policies":[{"id":"332","name":"Second division","parent":"Marketing"},
    {"id":"3323","name":"First division","parent":"Marketing"}]}]

Мой код

product = {}
product['id'] = {}
product['name'] = {}
product['Business'] = {}
x = [{**d, "Business": [i["name"] for i in d["Business"]]} for d in test]
product["policies"]["level1"] = []
product["policies"]["level2"] = []
for j in test["policies"]:
    if "Marketing" in j["parentName"]:
        d["level1"] += [j["name"]]
    if "Advertising" in j["parent"]:
        d["level2"] += [j["name"]]

Ожидается 2 идентификатора

[
  {
    "id": "100",
    "name": "A",
    "Business": ["Enterprise", "Customer"],
    "level1": ['Second division', 'First division'],
    "level2": [ ]
  },
  {
    "id": "101",
    "name": "B",
    "Business": ["Enterprise", "Customer"],
    "level1": ['Second division', 'First division'],
    "level2": [ ]
  }
]

Ответы [ 3 ]

1 голос
/ 05 августа 2020

Для этого фиксированный ввод (потому что в вашем примере test dict имеет дублированные ключи)

test = [{"id": "100", "name": "A",
         "Business": [{"id": "7", "name": "Enterprise"},
                      {"id": "8", "name": "Customer"}],
         "policies": [{"id": "332", "name": "Second division", "parent": "Marketing"},
                      {"id": "3323", "name": "First division", "parent": "Marketing"}],
         },
        {"id": "101", "name": "B",
         "Business": [{"id": "7", "name": "Enterprise"},
                      {"id": "8", "name": "Customer"}],
         "policies": [{"id": "332", "name": "Second division", "parent": "Marketing"},
                      {"id": "3323", "name": "First division", "parent": "Marketing"}]}]

Этот код будет делать то, что вы хотите


def do_the_thing(lst):
    resp = []

    parents_mapper = {
        'Marketing': 'level1',
        'Advertising': 'level2'
    }

    for el in lst:
        d = {
            'id': el['id'],
            'name': el['name'],
            'Business': [],
            'level1': [],
            'level2': []
        }
        for business in el.get('Business', []):
            business_name = business.get('name')
            if business_name:
                d['Business'].append(business_name)

        for policy in el.get('policies', []):
            policy_parent = policy.get('parent')
            parent_found = parents_mapper.get(policy_parent)
            policy_name = policy.get('name')
            if parent_found and policy_name:
                d[parent_found].append(policy_name)

        resp.append(d)
    return resp


if __name__ == "__main__":
    import pprint
    pp = pprint.PrettyPrinter(4)
    pp.pprint(do_the_thing(test))

1 голос
/ 05 августа 2020

Желая выиграть приз за самый уродливый код здесь сегодня, вот решение, использующее только понимание:

x = [{**d, "Business": [i["name"] for i in d["Business"]],
           "level1": [i["name"] for i in d["policies"] if i["parent"] == "Marketing"],
           "level2": [i["name"] for i in d["policies"] if i["parent"] == "Advertising"],
            } for d in test]

[d.pop("policies") for d in x]
pprint.pprint(x, sort_dicts=False)

Вывод:

[{'id': '100',
  'name': 'A',
  'Business': ['Enterprise', 'Customer'],
  'level1': ['Second division', 'First division'],
  'level2': []},
 {'id': '101',
  'name': 'B',
  'Business': ['Enterprise', 'Customer'],
  'level1': ['Second division', 'First division'],
  'level2': []}]
1 голос
/ 05 августа 2020

Обновлено с учетом редактирования . Я предполагаю, что отсутствующие ключи означают, что вы хотите пропустить этот конкретный словарь.

def filter_policies(employee, parent):
    return [policy['name'] for policy in employee['policies'] if policy['parent'] == parent]

def process_employee(employee):
    return {'id': employee['id'], 'name': employee['name'],
        'Business': [business['name'] for business in employee['Business']],
        'level1': filter_policies(employee, 'Marketing'),
        'level2': filter_policies(employee, 'Advertising')}

output = []
for employee in test:
    try:
        item = process_employee(employee)
    except KeyError:
        pass # ignore employees with missing dictionary keys
    else:
        output.append(item)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...