Свести список словарей, который содержит список словарей в python - PullRequest
0 голосов
/ 27 января 2020

Как мне организовать эту информацию, чтобы она превратилась в словарь без дубликатов? (Тип и имя не имеют значения, они могут повторяться, но кортеж (компания, год_семера, область, модель, категория, мера) не может дублироваться. Возможно, модель, категория или мера отсутствуют во входных данных.

INPUT :

data = [
    {
        "type": "Y",
        "id": "22",
        "name": "IX",
        "attri": {
            "company": "Peugeot",
            "year_semester": "2020_1",
            "area": "prod",
            "items": [
                {"model": "XYZ", "category": "CC", "measure": "2"},
                {"model": "XYZ", "category": "CC", "measure": "3"},
            ],
        },
    },
    {
        "type": "Y",
        "id": "11",
        "name": "IY",
        "attri": {
            "company": "Mazda",
            "year_semester": "2019_1",
            "area": "prod",
            "items": [{"model": "XYZ", "category": "CC", "measure": "2"}],
        },
    },
    {
        "type": "Y",
        "id": "11",
        "name": "IY",
        "attri": {
            "company": "Mazda",
            "year_semester": "2019_1",
            "area": "prod",
            "items": [
                {  # This should't appear because is repeated
                    "model": "XYZ",  # This should't appear because is repeated
                    "category": "CC",  # This should't appear because is repeated
                    "measure": "2",  # This should't appear because is repeated
                },
                {"model": "VVVV", "category": "CC", "measure": "4"},
            ],
        },
    },
    {
        "type": "Y",
        "id": "44",
        "name": "IY",
        "attri": {"company": "Honda", "year_semester": "2018_1", "area": "prod", "items": []},
    },
]

OUTPUT:

expected = [
    {
        "type": "Y",
        "id": "22",
        "name": "IX",
        "company": "Peugeot",
        "year_semester": "2020_1",
        "area": "prod",
        "model": "XYZ",
        "category": "CC",
        "measure": "2",
    },
    {
        "type": "Y",
        "id": "22",
        "name": "IX",
        "company": "Peugeot",
        "year_semester": "2020_1",
        "model": "XYZ",
        "category": "CC",
        "measure": "3",
    },
    {
        "type": "Y",
        "id": "11",
        "name": "IY",
        "company": "Mazda",
        "year_semester": "2019_1",
        "area": "prod",
        "model": "XYZ",
        "category": "CC",
        "measure": "2",
    },
    {
        "type": "Y",
        "id": "11",
        "name": "IY",
        "company": "Mazda",
        "year_semester": "2019_1",
        "area": "prod",
        "model": "VVVV",
        "category": "CC",
        "measure": "4",
    },
    {
        "type": "Y",
        "id": "44",
        "name": "IY",
        "company": "Honda",
        "year_semester": "2018_1",
        "area": "prod",
    },
]

Я пробовал это из другого поста:

def flatten(d, sep="_"):
  import collections

  obj = collections.OrderedDict()

  def recurse(t, parent_key=""):

    if isinstance(t, list):
        for i in range(len(t)):
            recurse(t[i], parent_key + sep + str(i) if parent_key else str(i))
    elif isinstance(t, dict):
        for k, v in t.items():
            recurse(v, parent_key + sep + k if parent_key else k)
    else:
        obj[parent_key] = t

recurse(d)

return obj

но я не уверен, как избежать дубликатов. И я не могу организовать желаемый вывод. У вас есть идеи?

1 Ответ

0 голосов
/ 27 января 2020

Что ж, у вас сэмплы плохо сформированы.

Я предполагаю, что ваши данные:

data = [
    {
        "type": "Y",
        "id": "22",
        "name": "IX",
        "attri": {
            "company": "Peugeot",
            "year_semester": "2020_1",
            "area": "prod",
            "items": [
                {"model": "XYZ", "category": "CC", "measure": "2"},
                {"model": "XYZ", "category": "CC", "measure": "3"},
            ],
        },
    },
    {
        "type": "Y",
        "id": "11",
        "name": "IY",
        "attri": {
            "company": "Mazda",
            "year_semester": "2019_1",
            "area": "prod",
            "items": [{"model": "XYZ", "category": "CC", "measure": "2"}],
        },
    },
    {
        "type": "Y",
        "id": "11",
        "name": "IY",
        "attri": {
            "company": "Mazda",
            "year_semester": "2019_1",
            "area": "prod",
            "items": [
                {  # This should't appear because is repeated
                    "model": "XYZ",  # This should't appear because is repeated
                    "category": "CC",  # This should't appear because is repeated
                    "measure": "2",  # This should't appear because is repeated
                },
                {"model": "VVVV", "category": "CC", "measure": "4"},
            ],
        },
    },
    {
        "type": "Y",
        "id": "44",
        "name": "IY",
        "attri": {"company": "Honda", "year_semester": "2018_1", "area": "prod", "items": []},
    },
]

Вы можете использовать функцию для "выравнивания" ваших данных, для экземпляр:

def flatten(record):
    attri = record["attri"]
    items = attri["items"]
    flat = {
        "type": record["type"],
        "id": record["id"],
        "name": record["name"],
        "company": attri["company"],
        "year_semester": attri["year_semester"],
        "area": attri["area"],
    }
    for item in items:
        flat.update(
            {
                "model": item["model"],
                "category": item["category"],
                "measure": item["measure"],
            }
        )
    return flat

Чтобы сгладить ваши данные, вы можете сделать:

result = list(map(flatten, data))

Результат выглядит следующим образом:

[{'area': 'prod',
  'category': 'CC',
  'company': 'Peugeot',
  'id': '22',
  'measure': '3',
  'model': 'XYZ',
  'name': 'IX',
  'type': 'Y',
  'year_semester': '2020_1'},
 {'area': 'prod',
  'category': 'CC',
  'company': 'Mazda',
  'id': '11',
  'measure': '2',
  'model': 'XYZ',
  'name': 'IY',
  'type': 'Y',
  'year_semester': '2019_1'},
 {'area': 'prod',
  'category': 'CC',
  'company': 'Mazda',
  'id': '11',
  'measure': '4',
  'model': 'VVVV',
  'name': 'IY',
  'type': 'Y',
  'year_semester': '2019_1'},
 {'area': 'prod',
  'company': 'Honda',
  'id': '44',
  'name': 'IY',
  'type': 'Y',
  'year_semester': '2018_1'}]

Конечно, это не так идеально соответствует тому, что вы хотите, но вы можете адаптировать его ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...