首页 > 解决方案 > 如何将子词典移动到另一个词典?

问题描述

我正在编写一个函数,它需要 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 的所有输入路径都是有效的。

标签: pythonalgorithm

解决方案


找到源的父字典和目标的字典,然后用源的键和值更新目标的字典(从源的父中删除它):

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':    {}} }
}

推荐阅读