按级别提取嵌套列表中的字符串

2024-09-28 20:20:14 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,这是一个递归的心不在焉的事情。我有一个不规则的嵌套列表,如下所示: 代理服务器=['a'、'b'、['c'、'd'、'e']、'f'、['g'、['h'、'j']、'k']、'l']

感谢一个递归函数,我想逐级提取项目。这样做的目的是获得如下输出: 一级:a、b、f、l 第二级:c、d、e、g、k 第三级: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')]

所以问题是深度层

递归性会炸毁我的头脑^^ 非常感谢你的帮助


Tags: 项目in目的chain列表forifdef
3条回答

给你:

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']

请尝试以下代码:

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)

我已经编辑了你的代码。诀窍不是维护局部变量depth,而是使用它将深度传递给函数实例。代码如下:

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')]

相关问题 更多 >