Как переместить под-словарь в другой словарь? - PullRequest
0 голосов
/ 05 мая 2020

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

def move(item_to_move, destination):
    # do something....

Мой исходный словарь выглядит так.

directories = { 
    'beers': {
        'ipa': {
            'stone': {}
        } 
    },

    'wines': {
        'red': {
            'cabernet': {}
        }
    },
    'other' : {}
}

Я хочу переместить подраздел или раздел словаря в другой раздел. Разделы представлены каждым ключом пути, разделенным символом '/'. Например, входные данные для моей функции будут:

item_to_move='beers/ipa'
destination='other'

move(directories, item_to_move,destination)

Результатом будет:

{ 
    'wines': {
        'red': {
            'cabernet': {}
        },
    },
    'other' :{
        'beers': {
            'ipa': {
                'stone': {}
        }   } 
    },
}

ПРИМЕЧАНИЕ. Я предполагаю, что все входные пути для items_to_move действительны.

1 Ответ

1 голос
/ 05 мая 2020

Найдите родительский словарь источника и словарь цели, затем обновите словарь цели с помощью ключа и значения источника (удалив его из родителя источника):

def move(tree,originPath,targetPath):
    originKey = None
    for originName in originPath.split("/"):
        originParent = originParent[originKey] if originKey else tree
        originKey = originName
    targetDict = tree
    for targetName in targetPath.split("/"):
        targetDict = targetDict[targetName] 
    targetDict.update({originKey:originParent.pop(originKey)})

вывод:

directories = { 
    'beers': {
        'ipa': {
            'stone': {}
        } 
    },

    'wines': {
        'red': {
            'cabernet': {}
        }
    },
    'other' : {}
}

move(directories,'beers/ipa','other')
print(directories)

{ 'beers': {},
  'wines': { 'red': {'cabernet': {}} },
  'other': { 'ipa': {'stone':    {}} }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...