【Python】嵌套字典Dict模拟树形结构实现增删

class Node(object):
    value = {'root': dict()}
    allValueList = ['root']

    def __init__(self):
        pass

    def append(self, trail, data):
        current = self.value['root']
        for item in trail:
            if item in list(current.keys()):
                current = current[item]
            else:
                return False

        index = self.allValueList.index(trail[-1]) + 1 if len(trail) > 0 else len(self.allValueList)
        if isinstance(data, str):
            current[data] = dict()
            self.allValueList.insert(index, data)
        elif isinstance(data, dict):
            if len(list(data.keys())) == 1:
                current[list(data.keys())[0]] = data[list(data.keys())[0]]
                self.allValueList.insert(index, list(data.keys())[0])

                for count, item in enumerate(re.findall('[^\[\',\"\]{}: ()]+', str(list(data.items())))[1:]):
                    self.allValueList.insert(index + count + 1, item)

            else:
                return False
        else:
            return False

        return True

    def remove(self, trail, key):
        if key in self.allValueList:
            if trail:
                current = self.value['root']
                for item in trail:
                    current = current[item]
                result = {key: current[key].copy()}
                childNode = re.findall('[^\[\',\"\]{}: ()]+', str(list(current[key].items())))
                del current[key]
                childNode.append(key)
                for item in childNode:
                    self.allValueList.remove(item)
                return result
            else:
                trail = self.find(key)
                return self.remove(trail, key)
        else:
            return False

    def find(self, key):
        if key in self.allValueList:
            target = list()
            beginIndex = 0
            endIndex = self.allValueList.index(key)
            current = self.value['root']
            targetList = list(current.keys())[::-1]
            while beginIndex < endIndex:
                for item in targetList:
                    if item in self.allValueList[beginIndex + 1: endIndex + 1]:
                        beginIndex = self.allValueList.index(item)
                        target.append(item)
                        current = current[item]
                        break
                if current:
                    targetList = list(current.keys())[::-1]
                    pass
                elif target[-1] == key:
                    pass
                else:
                    current = self.value['root']
                    for item in target[:-1]:
                        current = current[item]
                    targetList = list(current.keys())[::-1]
                    index = targetList.index(target[-1])
                    targetList = targetList[index + 1:]
                    target.remove(target[-1])
            return target[:-1]
        else:
            return False

    def test(self):
        print(self.value, self.allValueList)


if __name__ == '__main__':
    node = Node()
    node.append([], '0')
    node.append([], '1')
    node.append([], '2')
    node.append(['1'], '3')
    node.append(['1', '3'], '5')
    node.append(['1', '3'], '4')
    node.append(['1', '3', '5'], '6')
    node.test()
    # print(node.find('6'))
    # print(node.find('3'))
    d = node.remove(None, '3')
    node.test()
    node.append(['1'], d)
    node.test()

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值