python中无限遍历在多维嵌套字典、列表的JSON中获取路径path跟对应的值——find_path(终极版)

博主在寻找能够获取多维嵌套字典和列表中值的完整路径的解决方案时,发现现有方法并不满足需求。因此,他们自行开发了一个新的函数,能够在遍历时记录路径,并且可以基于键或值查找,特别是在存在相同键的情况下。这种方法提高了效率,实现了从键到值或从值到键的完整路径查找。
摘要由CSDN通过智能技术生成

真鸡儿痛苦,网上搜寻了一大堆,都没我想要的,要不是纯字典,要不只能拿到value值,我想要的是具体路径啊!

没把法,只能自己强上了!本来3个函数就能搞定了,根据要找的value值得到该值的具体路径,但是后面又想到有时是要根据key值得到对应的value,而且在镶嵌字典里,一样名字的key应该不少啊,最好还能返回要找的key的具体路径跟它对应的值,具体看代码

之前2个版本都是先找到目标,然后再一步步补全路径,但是这样做太蛋疼,效率太低了!
后来我想通了,应该在初始时遍历每个字典、列表就记录补全路径path才是王道,最后找到了目标,就把path添加到集合list!
这次完美多了!!

class find_path():
    def __init__(self,target):
        self.target=target

    def find_the_value(self,target,value,path='',path_list=None):
        '''完全匹配,每经过一层(list、dict)都会记录path,到了最后一层且当前target就是要找的目标,才把对应的path记录下来
        :param target: 被搜索的目标
        :param value: 要搜索的关键字
        :param path: 当前所在的路径
        :param path_list: 存放所有path的列表
        判断当前target类型:···是字典,循环内容,每个键值都记录下路径path,然后以当前值v为判断target,调用自身传入添加了的path判断
                             ···是列表,循环内容,每个元素都记录下路径path,然后以当前元素为判断target,调用自身传入添加了的path判断
                             ···是str或者int,那么就判断当前target是否就是要搜索的value,如果是,那就把路径path放进list里面'''
        if isinstance(target, dict):
            for k, v in target.items():
                path1 = copy.deepcopy(path)
                path1=path1+str([k])
                self.find_the_value(v, value, path1, path_list)

        elif isinstance(target, (list, tuple)):  # 判断了它是列表
            for i in target:
                path1 = copy.deepcopy(path)
                posi = target.index(i)
                path1 = path1+'[%s]' % posi
                self.find_the_value(i, value, path1, path_list)

        elif isinstance(target, (str, int)) :
            if  str(value) ==str(target):   #必须完全相同
                path_list.append(path)


    def find_in_value(self,target,value,path='',path_list=None):
        '''包含匹配,内容跟上面一样,只是最后判断时不同'''
        if isinstance(target, dict):
            for k, v in target.items():
                path1 = copy.deepcopy(path)
                path1=path1+str([k])
                self.find_in_value(v, value, path1, path_list)

        elif isinstance(target, (list, tuple)):  # 判断了它是列表
            for i in target:
                path1 = copy.deepcopy(path)
                posi = target.index(i)
                path1 = path1+'[%s]' % posi
                self.find_in_value(i, value, path1, path_list)

        elif isinstance(target, (str, int)) :
            if  str(value) in str(target):   #
                path_list.append(path)

    def find_the_key(self,target,key,path='',path_list=None):
        '''查找key,每经过一层(list、dict)都会记录path,在字典时,若当前的k就是要找的key,那就把对应的path记录下来
                :param target: 被搜索的目标
                :param key: 要搜的键
                :param path: 当前所在的路径
                :param path_list: 存放所有path的列表
                判断当前target类型:···是字典,循环内容,每个键值都记录下路径path,判断当前k是否要查找的:~~~是,那就把路径path放进list里面
                                                                                                 ~~~不是,以当前值v为判断target,调用自身传入添加了的path判断
                                  ···是列表,循环内容,每个元素都记录下路径path,然后以当前元素为判断target,调用自身传入添加了的path判断
                                     '''
        if isinstance(target, dict):
            for k, v in target.items():
                path1 = copy.deepcopy(path)
                path1=path1+str([k])
                if str(key) == str(k):
                    path_list.append(path1)
                else:
                    self.find_the_key(v, key, path1, path_list)

        elif isinstance(target, (list, tuple)):  # 判断了它是列表
            for i in target:
                path1 = copy.deepcopy(path)
                posi = target.index(i)
                path1 = path1+'[%s]' % posi
                self.find_the_key(i, key, path1, path_list)

#==
  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值