Как объединить сложные словари в список сложных слов, где ключ появляется несколько раз

У меня есть список диктовок, каждый из которых относится к команде и ее активам.

например

list_of_dicts = [
    {
        "team": "X",
        "description": "A description of X",
        "types": [
            {
                "type": "TYPEA",
                "assets": {
                    "high_value": [
                        {"id": "asset_1_id", "name": "asset_1_name"},
                        {"id": "asset_2_id", "name": "asset_2_name"},
                    ],
                    "low_value": [
                        {"id": "asset_3_id", "name": "asset_3_name"},
                        {"id": "asset_4_id", "name": "asset_4_name"},
                    ],
                },
            },
            {
                "type": "TYPEB",
                "assets": {
                    "high_value": [
                        {"id": "asset_1_id", "name": "asset_1_name"},
                        {"id": "asset_2_id", "name": "asset_2_name"},
                    ],
                    "low_value": [
                        {"id": "asset_3_id", "name": "asset_3_name"},
                        {"id": "asset_4_id", "name": "asset_4_name"},
                    ],
                },
            },
        ],
    },
    {
        "team": "X",
        "description": "A description of X",
        "types": [
            {
                "type": "TYPEC",
                "assets": {
                    "high_value": [
                        {"id": "asset_1_id", "name": "asset_1_name"},
                        {"id": "asset_2_id", "name": "asset_2_name"},
                    ],
                    "low_value": [
                        {"id": "asset_3_id", "name": "asset_3_name"},
                        {"id": "asset_4_id", "name": "asset_4_name"},
                    ],
                },
            }
        ],
    },
]

Здесь есть 2 диктанта для команды X с разными типами (TYPEA и TYPEB, затем еще один с TYPEC), также будет 2 диктанта для команды Y, возможно, 3 для команды Z и т. д.

Мой желаемый результат - иметь список диктовок, в котором есть только 1 диктовку для команды X, которая имеет типы A, B и C вместе.

* Желаемый результат не указан, так как пример очень длинный. С удовольствием добавлю.

Будет выглядеть примерно так:

list_of_dicts = [
    {
        "team": "X",
        "description": "A description of X",
        "types": [
            {
                "type": "TYPEA",
                "assets": {...},
            {,
            {
                "type": "TYPEB",
                "assets": {...},
            {,
            {
                "type": "TYPEC",
                "assets": {...},
            {,
        ],
    },
]

Во втором list_of_dicts отсутствуют закрывающие скобки.

Barmar 21.06.2024 23:19

Исправлю, спасибо

Bob 21.06.2024 23:21

Что вы пробовали? Это не сложная задача.

Tim Roberts 21.06.2024 23:21

Прокрутите один из списков, чтобы получить название команды. Затем пройдитесь по другому списку, найдя все записи с одной и той же командой, и объедините списки types.

Barmar 21.06.2024 23:23

Привет @Barmar, есть только один список диктовок. Я не уверен, как мне сравнить «элемент, на котором я нахожусь в цикле», со следующим элементом в цикле, чтобы объединить их?

Bob 21.06.2024 23:28

Привет @TimRoberts, я новичок, я потратил несколько часов на изучение переполнения стека, но не могу найти ничего, что подходило бы для моего решения, или понять, как заставить их работать.

Bob 21.06.2024 23:29

Изначально в вопросе было два списка, я думал, вы хотите их объединить.

Barmar 21.06.2024 23:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
7
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Создайте словарь, ключами которого являются названия команд. Затем просмотрите список словарей, используя его для объединения списков types для одной команды.

result_dict = {}

for d in list_of_dicts:
    if d['team'] in result_dict:
        result_dict[d['team']]['types'].extend(d['types'])
    else:
        result_dict[d['team']] = d

list_of_dicts = list(result_dict.values())

Большое спасибо! Это работает отлично!

Bob 22.06.2024 00:05

Если вы также хотите объединить активы типа:

вход:

list_of_dicts = [
    {
        "team": "X",
        "description": "A description of X",
        "types": [
            {
                "type": "TYPEA",
                "assets": {
                    "high_value": [
                        {"id": "asset_1_id", "name": "asset_1_name"},
                        {"id": "asset_2_id", "name": "asset_2_name"},
                    ],
                    "low_value": [
                        {"id": "asset_3_id", "name": "asset_3_name"},
                        {"id": "asset_4_id", "name": "asset_4_name"},
                    ],
                },
            },
            {
                "type": "TYPEB",
                "assets": {
                    "high_value": [
                        {"id": "asset_1_id", "name": "asset_1_name"},
                        {"id": "asset_2_id", "name": "asset_2_name"},
                    ],
                    "low_value": [
                        {"id": "asset_3_id", "name": "asset_3_name"},
                        {"id": "asset_4_id", "name": "asset_4_name"},
                    ],
                },
            },
        ],
    },
    {
        "team": "X",
        "description": "A description of X",
        "types": [
            {
                "type": "TYPEC",
                "assets": {
                    "high_value": [
                        {"id": "asset_1_id", "name": "asset_1_name"},
                        {"id": "asset_2_id", "name": "asset_2_name"},
                    ],
                    "low_value": [
                        {"id": "asset_3_id", "name": "asset_3_name"},
                        {"id": "asset_4_id", "name": "asset_4_name"},
                    ],
                },
            }
        ],
    },
    {
        "team": "Z",
        "description": "A description of Z",
        "types": [
            {
                "type": "TYPEA",
                "assets": {
                    "high_value": [
                        {"id": "asset_1_id", "name": "asset_1_name"},
                        {"id": "asset_2_id", "name": "asset_2_name"},
                    ],
                    "low_value": [
                        {"id": "asset_3_id", "name": "asset_3_name"},
                        {"id": "asset_4_id", "name": "asset_4_name"},
                    ],
                },
            }
        ],
    },
    {
        "team": "Z",
        "description": "A description of Z",
        "types": [
            {
                "type": "TYPEA",
                "assets": {
                    "high_value": [
                        {"id": "asset_5_id", "name": "asset_5_name"},
                        {"id": "asset_6_id", "name": "asset_6_name"},
                    ],
                    "low_value": [
                        {"id": "asset_7_id", "name": "asset_7_name"},
                        {"id": "asset_8_id", "name": "asset_8_name"},
                    ],
                },
            }
        ],
    },
]

функция:

from pprint import pprint as print

def group_assets_by_team_and_type(list_of_dicts: list[dict]):
    """
    Groups assets by team and type.

    Args:
        list_of_dicts (list[dict]): A list of dictionaries representing assets.

    Returns:
        list[dict]: A list of dictionaries containing assets grouped by team and type.
    """
    assets_by_team: dict[str, dict] = {}
    for item in list_of_dicts:
        team = item["team"]
        description = item["description"]
        assets_by_team.setdefault(
            team, {"team": team, "description": description, "types": {}}
        )
        for type_dict in item["types"]:
            type_name = type_dict["type"]
            assets_by_team[team]["types"].setdefault(
                type_name, {"high_value": [], "low_value": []}
            )
            assets_by_team[team]["types"][type_name]["high_value"].extend(
                type_dict["assets"]["high_value"]
            )
            assets_by_team[team]["types"][type_name]["low_value"].extend(
                type_dict["assets"]["low_value"]
            )
    return [
        {
            "team": item["team"],
            "description": item["description"],
            "types": [
                {"type": type_name, "assets": assets}
                for type_name, assets in item["types"].items()
            ],
        }
        for item in assets_by_team.values()
    ]

output = group_assets_by_team_and_type(list_of_dicts)
print(output, sort_dicts=False)

выход:

output = [
    {
        "team": "X",
        "description": "A description of X",
        "types": [
            {
                "type": "TYPEA",
                "assets": {
                    "high_value": [
                        {"id": "asset_1_id", "name": "asset_1_name"},
                        {"id": "asset_2_id", "name": "asset_2_name"},
                    ],
                    "low_value": [
                        {"id": "asset_3_id", "name": "asset_3_name"},
                        {"id": "asset_4_id", "name": "asset_4_name"},
                    ],
                },
            },
            {
                "type": "TYPEB",
                "assets": {
                    "high_value": [
                        {"id": "asset_1_id", "name": "asset_1_name"},
                        {"id": "asset_2_id", "name": "asset_2_name"},
                    ],
                    "low_value": [
                        {"id": "asset_3_id", "name": "asset_3_name"},
                        {"id": "asset_4_id", "name": "asset_4_name"},
                    ],
                },
            },
            {
                "type": "TYPEC",
                "assets": {
                    "high_value": [
                        {"id": "asset_1_id", "name": "asset_1_name"},
                        {"id": "asset_2_id", "name": "asset_2_name"},
                    ],
                    "low_value": [
                        {"id": "asset_3_id", "name": "asset_3_name"},
                        {"id": "asset_4_id", "name": "asset_4_name"},
                    ],
                },
            },
        ],
    },
    {
        "team": "Z",
        "description": "A description of Z",
        "types": [
            {
                "type": "TYPEA",
                "assets": {
                    "high_value": [
                        {"id": "asset_1_id", "name": "asset_1_name"},
                        {"id": "asset_2_id", "name": "asset_2_name"},
                        {"id": "asset_5_id", "name": "asset_5_name"},
                        {"id": "asset_6_id", "name": "asset_6_name"},
                    ],
                    "low_value": [
                        {"id": "asset_3_id", "name": "asset_3_name"},
                        {"id": "asset_4_id", "name": "asset_4_name"},
                        {"id": "asset_7_id", "name": "asset_7_name"},
                        {"id": "asset_8_id", "name": "asset_8_name"},
                    ],
                },
            }
        ],
    },
]

Другие вопросы по теме