【问题标题】:Returning a value from recursive function that searches through JSON从通过 JSON 搜索的递归函数返回一个值
【发布时间】:2019-10-24 13:22:19
【问题描述】:

我无法解决这个问题!我正在使用以下代码将 JSON 文件转换为 python 中的可读格式:

jsonDict = json.loads(jsonFile.read())
x = self.searchJSON('search_term', jsonDict)

然后使用这个递归函数循环遍历字典找到我需要的键。

def searchJSON(self, searchTerm, di=None):
    for k in di:
        if k == searchTerm:
            return di[k]
        if isinstance(k, dict):
            self.searchJSON(searchTerm, k)
        elif isinstance(k, list):
            self.searchJSON(searchTerm, k[0])
        elif isinstance(di[k], list) or isinstance(di[k], dict):
            self.searchJSON(searchTerm, di[k])

使用它,我可以找到我正在寻找的值 - 没问题..但我需要将值返回到函数外部。

当我添加退货时:

def searchJSON(self, searchTerm, di=None):
    for k in di:
        if k == searchTerm:
            return di[k]
        if isinstance(k, dict):
            return self.searchJSON(searchTerm, k)
        elif isinstance(k, list):
            return self.searchJSON(searchTerm, k[0])
        elif isinstance(di[k], list) or isinstance(di[k], dict):
            return self.searchJSON(searchTerm, di[k])

函数在遇到空列表时停止运行。我花了一整天的时间试图弄清楚这一点,这是我能够得到的最接近返回值的方法。

【问题讨论】:

  • 如果你的函数不能处理空列表,那么当它遇到空列表时它不可能做任何事情。我知道这不是很有帮助,但是在递归方面,您应该始终有一个明确定义的基本案例。在这种情况下,当您的 k 是一个列表时,空列表似乎是一个基本情况。但是di 是什么?那是字典吗?因为你不能使用list 作为字典的键
  • 是的,基本上你的函数总是有一个bug,而你还不知道。下面发布的答案显示了如何解决它。
  • 第一次调用该函数时,di 是表示为列表的 JSON 文件。所以它包含列表、字典和一些空键。

标签: python json python-3.x dictionary


【解决方案1】:

试试这个(更新):

def searchJSON(self, searchTerm, di=None):

    for k in di:
        if k == searchTerm:
            return di[k]

        if isinstance(k, dict):
            return self.searchJSON(searchTerm, k)

        elif isinstance(k, list):
            if k:
                return self.searchJSON(searchTerm, k[0])
            else:
                pass

        elif isinstance(di[k], list) or isinstance(di[k], dict):
            if di[k]:
                return self.searchJSON(searchTerm, di[k])
            else:
                pass

【讨论】:

  • 这也不起作用。我认为它停止的地方是最后一个elif 语句,因为它正在检查是否包含空列表的键的值 - 然后传递空列表。
  • 我使用了你的建议,并输入了if di[k] .... else: pass 并修复了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 2014-05-01
  • 1970-01-01
  • 2012-10-16
  • 2016-11-22
  • 2021-06-11
  • 1970-01-01
相关资源
最近更新 更多