【问题标题】:Extract string in nested lists by level按级别提取嵌套列表中的字符串
【发布时间】:2020-10-22 17:02:47
【问题描述】:

好的,这是一个递归的打破思维的事情。我有不规则的嵌套列表,如下所示: 代理=['a','b',['c','d','e'],'f',['g',['h','j'],'k'],' l']

感谢递归函数,我想逐级提取项目。这个想法是有一个像这样的输出: 1级:a,b,f,l 2级:c,d,e,g,k 3级:h,j 这些嵌套列表代表 n 叉树。 到目前为止,我尝试过这样的事情:

def extractbylevel(chain):
    r=[]
    depth=0
    for item in chain:
        if isinstance(item,str):
            r.append((depth,item))
            if depth > 0:
                depth -=1
        else:
            depth += 1
            r = r+extractbylevel(item)
    return r

结果输出为:

[(0, 'a'),
 (0, 'b'),
 (0, 'c'),
 (0, 'd'),
 (0, 'e'),
 (1, 'f'),
 (0, 'g'),
 (0, 'h'),
 (0, 'j'),
 (1, 'k'),
 (1, 'l')]

所以问题是深度级别...

递归将让我大吃一惊... ^^ 非常感谢您的帮助!!!!

【问题讨论】:

    标签: python recursion tree nested


    【解决方案1】:

    我已编辑您的代码以使其正常工作。诀窍不是维护局部变量深度,而是将深度传递给使用它的函数实例。下面是代码:

    chain = ['a','b',['c','d','e'],'f',['g',['h','j'],'k'],'l']
    
    def extractbylevel(chain, depth=0):
        r=[]
        for item in chain:
            if isinstance(item,str):
                r.append((depth,item))
            else:
                r = r+extractbylevel(item, depth+1)
        return r
        
    print(extractbylevel(chain))
    
    #answer
    [(0, 'a'), (0, 'b'), (1, 'c'), (1, 'd'), (1, 'e'), (0, 'f'), (1, 'g'), (2, 'h'), (2, 'j'), (1, 'k'), (0, 'l')]
    

    【讨论】:

    • 哦该死的!!!!我在附近,不是吗?非常感谢你。 Subhrajyoti...你避免我变得完全疯了!谢谢sssss!
    【解决方案2】:

    给你:

    In [1]: %paste                                                                  
    from collections import defaultdict
    
    def extractbylevel(chain, depth, levels):
        for item in chain:
            if isinstance(item,str):
                levels['level {}'.format(depth)].append(item)
            else:
                extractbylevel(item, depth + 1, levels)
    
    proxy=['a','b',['c','d','e'],'f',['g',['h','j'],'k'],'l']
    output = defaultdict(list)
    extractbylevel(proxy, 1, output)
    
    for k, v in output.items():
        print(k, v)
    
    ## -- End pasted text --
    level 1 ['a', 'b', 'f', 'l']
    level 2 ['c', 'd', 'e', 'g', 'k']
    level 3 ['h', 'j']
    

    【讨论】:

    • 感谢您的回答。使用字典输出的好主意!!!如果我没记错的话,这类似于广度优先搜索 n 叉树不是吗?
    • @TristanSalord No. 这是深度优先搜索。
    • 哦,是的!你说的很对,谢谢指正
    【解决方案3】:

    试试这个代码:

    def f(l, d=0):
    r = []
    for e in l:
        if type(e) == str:
            r.append((e, d))
        else:
            r += f(e, d+1)
    return r
    

    你这样调用函数:

    L = ['a', 'b', ['c', 'd', 'e'], 'f', ['g', ['h', 'j'], 'k'], 'l']
    f(L, 0)  # or just like f(L)
    

    【讨论】:

    • 感谢 ThunderPheonix !当我分析我的问题时,我认为部分原因是我不知道如何使用深度作为函数的参数,因此将作为变量放入函数中使其每次都重新初始化(我清楚吗?)并且它是我的错。
    • @TristanSalord 它不会让它每次都重新初始化,但它会根据调用函数的 depth 值获得另一个值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2016-02-08
    • 1970-01-01
    • 2019-03-14
    • 2017-01-22
    • 2018-06-23
    • 1970-01-01
    相关资源
    最近更新 更多