Я пытаюсь объединить два 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"
}
]
}
Я обновляю словарь для лучшего понимания @PaulH
откуда dmep
? в основе это кажется простым вопросом, на который можно легко ответить, если вы могли бы представить четкие требования к результату. что у вас вообще не понятно. выньте 90% того, что у вас есть, и просто оставьте это как 2 списка с минимальным количеством диктов в них. что вы хотите на выходе? тот факт, что ваши словари в настоящее время сложны, ничего не добавляет к вашему вопросу, это только сбивает нас с толку и заставляет вас работать сверхурочно, чтобы исправить несоответствия в ваших образцах.
@JLPeyret dmep
— это всего лишь примеры данных. так что не беспокойтесь о данных. Мне просто нужно следовать формату вывода с помощью поиска, если у родителя есть дочерние методы.
ну, я не минусую тебя, потому что ты новенький. но, пожалуйста, поймите, что это не способствует получению ответов или голосов. то, что я предлагаю вам сделать, это написать простейшие 2 диктовки в каждом списке в сценарии. запустите сценарий и удалите сложность из структур данных до тех пор, пока вы не сможете сделать что-то проще, не теряя цель того, что вы хотите. затем опубликуйте сценарий, текущий плохой результат и желаемый результат. не беспокойтесь о данных, это не ответ.
Выходные данные вашего примера должны совпадать с входными данными вашего примера, иначе люди, добровольно тратящие свое время, чтобы помочь вам с вашей проблемой (за которую вы можете получить компенсацию), не будут знать, правильное или неправильное их решение.
Если вы не хотите создавать новый объект, вы можете отказаться от операций копирования.
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
ваш желаемый результат, кажется, имеет довольно много ошибок или, по крайней мере, несоответствий с вводом.