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

У меня есть словарь ниже

  • Сначала мне нужно проверить родительский элемент, который содержит Main или Contract.
  • FOr Main добавить name в словарь level1 и словарь уровня 2
    d = {"employee": [
          {
            "id": "18",
            "name": "Manager",
            "parent": "Main level"
          },
          {
            "id": "19",
            "name": "Employee",
            "parent": "Main level"
          },
          {
            "id": "32",
            "name": "Contract",
            "parent": "Contract level"
          },
              {
            "id": "21",
            "name": "Admin",
            "parent": "Main level"
          },
        ]}

Ожидаемый результат ниже

 {"employee": [
    {'level1':['Manager','Employee']},
    {'level2':['Test','HR']},
      {
        "id": "18",
        "name": "Manager",
        "parent": "Main level"
      },
      {
        "id": "19",
        "name": "Employee",
        "parent": "Main level"
      },
      {
        "id": "32",
        "name": "Test",
        "parent": "Contract level"
      },
          {
        "id": "21",
        "name": "HR",
        "parent": "Contract level"
      },
    ]}

Код

d['level1'] = {}
d['level2'] = {}
for i,j in d.items():
  #check parent is Main 
  if j['parent'] in 'Main':
      d['level1'] = j['name']
  if j['parent'] in 'Contract':
      d['level2'] = j['name']

Я получил ошибку TypeError: list indices must be integers or slices, not str

Ответы [ 2 ]

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

Попробуйте следующее:

dd = {'Main level': 'level1', 'Contract level': 'level2'}

res = {}
for x in d['employee']:
    k = dd[x['parent']]
    if k in res:
        res[k].append(x['name'])
    else:
        res[k] = [x['name']]

d['employee'] = [{k: v} for k, v in res.items()] + d['employee']
print(d)

Вывод:

{'employee': [{'level1': ['Manager', 'Employee', 'Admin']},
  {'level2': ['Contract']},
  {'id': '18', 'name': 'Manager', 'parent': 'Main level'},
  {'id': '19', 'name': 'Employee', 'parent': 'Main level'},
  {'id': '32', 'name': 'Contract', 'parent': 'Contract level'},
  {'id': '21', 'name': 'Admin', 'parent': 'Main level'}]}
0 голосов
/ 05 августа 2020

Ваш for l oop введен неверно.

Вы сделали 3 ошибки:

  1. Вы попытались перебрать родительский словарь вместо фактического списка сотрудников.
  2. Вы используете x in y в обратном направлении, чтобы проверить, содержит ли одна строка другую.
  3. Фактически вы не добавляете новые имена в списки «уровней».

Попробуйте следующее:

d["level1"] = []
d["level2"] = []
for j in d["employee"]:
    # check parent is Main
    if "Main" in j["parent"]:
        d["level1"] += [j["name"]]
    if "Contract" in j["parent"]:
        d["level2"] += [j["name"]]

Это даст вам «уровни» как dict «братьев и сестер» сотрудников (вместо списка сотрудников, что вы на самом деле хотите).

Чтобы получить точный результат, который вы хотите, вам нужно будет сделать что-то вроде этого:

level1 = []
level2 = []
for j in d["employee"]:
    # check parent is Main
    if "Main" in j["parent"]:
        level1 += [j["name"]]
    if "Contract" in j["parent"]:
        level2 += [j["name"]]

d["employee"] = [{"level1": level1}, {"level2": level2}] + d["employee"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...