Как мне объединить два списка [dict] и правильно упорядочить их по идентификатору?

Я пытаюсь объединить два list[dict] в следующий формат и упорядочить обе техники и подтехники, но я не знаю, как правильно их соединить, не затрагивая другие техники.

techniques = [{
   "technique_id":"T1548",
   "technique":"demo",
   "url":"url",
   "tactic":[
      "demo",
      "demo"
   ]
}]


subtechniques = [{
   "technique_id":"T1548.002",
   "technique":"demo",
   "url":"url"
}]


def merge_techniques(techniques, subtechniques):
    change_list = []
    for x in techniques:
        for y in subtechniques:
            if x['technique_id'] == y['technique_id'].split('.')[0]:
                print(x)
                print(y)
    return change_list


merge_techniques(techniques, subtechniques)

желаемый результат

{
   "technique_id":"T1548",
   "technique":"dmep",
   "url":"https://xxxxxxxxxxxx",
   "tactic":[
      "xxxxxxxxxxxx",
      "xxxxxxxxxxxx"
   ],
   "subtechnique": [
       {
        "technique_id":"T1548.002",
        "technique":"demo",
        "url":"url"
       }
    ]
}

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

Paul H 13.12.2020 21:58

Я обновляю словарь для лучшего понимания @PaulH

victor_angel27 13.12.2020 22:00

откуда dmep? в основе это кажется простым вопросом, на который можно легко ответить, если вы могли бы представить четкие требования к результату. что у вас вообще не понятно. выньте 90% того, что у вас есть, и просто оставьте это как 2 списка с минимальным количеством диктов в них. что вы хотите на выходе? тот факт, что ваши словари в настоящее время сложны, ничего не добавляет к вашему вопросу, это только сбивает нас с толку и заставляет вас работать сверхурочно, чтобы исправить несоответствия в ваших образцах.

JL Peyret 13.12.2020 22:07

@JLPeyret dmep — это всего лишь примеры данных. так что не беспокойтесь о данных. Мне просто нужно следовать формату вывода с помощью поиска, если у родителя есть дочерние методы.

victor_angel27 13.12.2020 22:08

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

JL Peyret 13.12.2020 22:13

Выходные данные вашего примера должны совпадать с входными данными вашего примера, иначе люди, добровольно тратящие свое время, чтобы помочь вам с вашей проблемой (за которую вы можете получить компенсацию), не будут знать, правильное или неправильное их решение.

Paul H 13.12.2020 22:18
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
6
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если вы не хотите создавать новый объект, вы можете отказаться от операций копирования.

import copy

def merge_techniques(techniques, subtechniques):
    result = []
    # create technique_id dictionary
    techniques_dict = dict()
    for tech in techniques:
        # create new object
        tech_copy = copy.copy(tech)
        
        techniques_dict[tech['technique_id']] = tech_copy
        result.append(tech_copy)
    
    # visit all sub techniques
    for subtech in subtechniques:
        tech_id = subtech['technique_id'].split('.')[0]
        
        # search by tech_id 
        if tech_id not in techniques_dict:
            # if not found
            print('Tech %s is not found'%(tech_id))
            continue
        
        # get tech by tech_id
        tech = techniques_dict[tech_id]
        
        # create subtechnique array if not existed
        if 'subtechnique' not in tech:
            tech['subtechnique'] = []
            
        # copy subtech object
        tech['subtechnique'].append(copy.copy(subtech))
    
    return result

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