У меня есть список диктовок, каждый из которых относится к команде и ее активам.
например
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": {...},
{,
],
},
]
Исправлю, спасибо
Что вы пробовали? Это не сложная задача.
Прокрутите один из списков, чтобы получить название команды. Затем пройдитесь по другому списку, найдя все записи с одной и той же командой, и объедините списки types
.
Привет @Barmar, есть только один список диктовок. Я не уверен, как мне сравнить «элемент, на котором я нахожусь в цикле», со следующим элементом в цикле, чтобы объединить их?
Привет @TimRoberts, я новичок, я потратил несколько часов на изучение переполнения стека, но не могу найти ничего, что подходило бы для моего решения, или понять, как заставить их работать.
Изначально в вопросе было два списка, я думал, вы хотите их объединить.
Создайте словарь, ключами которого являются названия команд. Затем просмотрите список словарей, используя его для объединения списков 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())
Большое спасибо! Это работает отлично!
Если вы также хотите объединить активы типа:
вход:
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"},
],
},
}
],
},
]
Во втором
list_of_dicts
отсутствуют закрывающие скобки.