代码之家  ›  专栏  ›  技术社区  ›  xiaoshir

递归函数:“nonetype”对象不可iterable

  •  0
  • xiaoshir  · 技术社区  · 8 年前

    我有一本嵌套字典,

    d={
        "A":1, 
        "depth":0, 
        "chain":[
            {
                "A1":0.7, 
                "depth":1,
                "chain":[
                    {
                        "A11":0.3,
                        "depth":2,
                        "key2":{"direct":{},"cumulative":{"B":0.3}}, 
                        "chain":[]
                    }, 
                    {
                        "A12":0.4, 
                        "depth":2,
                        "chain":[
                            {
                                "A121":0.4, 
                                "depth":3, 
                                "key2":{"direct": {}, "cumulative":{"C":0.2, "D": 0.2}}, 
                               "chain": []
                            }]}]},
            {
                "A2":0.3,
                "depth":1,
                "chain":[
                    {
                        "A11":0.3, 
                        "depth":2, 
                        "key2":{"direct":{}, "cumulative":{"D":0.3}},
                        "chain":[]
                    }]}]}
    

    我想返回一个列表,第一个键重复X次。x是“链”下的元素数。在这种情况下,它将返回:

    ["A", "A", "A1", "A1", "A2", "A12"]
    

    我试过以下方法

    def from_nodes(d):
        from_n=[list(d.keys())[0]]*len(d["chain"])
        for x in d["chain"]:
            if x is not None:
                from_n.extend(from_nodes(x))
                return from_n
    

    得到了错误

    TypeError                                 Traceback (most recent call last)
    <ipython-input-196-6233463c604b>in <module>()
    ----> 1 from_nodes(test2)
    
    <ipython-input-194-5b7ca4b6db75>in from_nodes(d)
      3     for x in d["chain"]:
      4         if x is not None:
    ----> 5             from_n.extend(from_nodes(x))
      6         return from_n
    
    <ipython-input-194-5b7ca4b6db75> in from_nodes(d)
      3     for x in d["chain"]:
      4         if x is not None:
    ----> 5             from_n.extend(from_nodes(x))
      6         return from_n
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   pault Tanjin    8 年前

    正如我在 comments ,您的错误是返回语句缩进不正确。如果 d["chain"] 为空或 None ,您的功能将 return None implicitly .

    将您的功能更改为:

    def from_nodes(d):
        from_n=[list(d.keys())[0]]*len(d["chain"])
        for x in d["chain"]:
            if x is not None:
                from_n.extend(from_nodes(x))
        return from_n
    

    将修复错误,我的计算机上的结果是:

    print(from_nodes(d))
    #['A', 'A', 'A1', 'A1', 'depth', 'depth']
    

    这与您期望的输出不匹配——这是因为您不能保证在调用时获得确定的顺序 .keys() .

    为所需输出修改函数的一种方法是创建要忽略的键列表:

    def from_nodes(d):
        ignore_keys = {"chain", "depth", "key2"}
        from_n=[list(k for k in d.keys() if k not in ignore_keys)[0]]*len(d["chain"])
        for x in d["chain"]:
            if x is not None:
                from_n.extend(from_nodes(x))
        return from_n
    
    print(from_nodes(d))
    #['A', 'A', 'A1', 'A1', 'A12', 'A2']
    

    然而,这只是我猜测您的需求是什么。您需要为您所说的“First”键定义正确的条件。