得到最深的嵌套列表

时间:2013-06-14 19:14:12

标签: python-2.7 recursion

新程序员在这里。原谅任何偶尔的白痴。

我试图写一个小函数,它返回(任意大的)嵌套列表中最深的列表。子列表包含元组和字符串。

示例:

L = ['o', ([], [(1, 'V'), (-1, 'C')]), ['o', ['o', (['prefers'], [(1, 'D'), (1, 'D'), (-1, 'V')]), ['o', (['the'], [(1, 'N'), (-1, 'D')]), (['beer'], [(-1, 'N')])]], ['o', (['the'], [(1, 'N'), (-1, 'D')]), (['king'], [(-1, 'N')])]]]

我意识到解决这个问题非常困难。这是嗯,为什么我要机器这样做。

(如果你想知道,我是语言学家,这个列表定义了极简主义语法中句子的派生树。)我想要的是返回最深入嵌入的列表,在此案例[' o',([''],[(1,' N'),(-1,' D') ]),(['啤酒'],[(-1,' N')])]]。这是我尝试过的(除其他事项外):

def get_deepest(L):
    is_list = True
    while is_list == True:
        for e in L:
            is_list = any(isinstance(e,list) for e in L)
            get_deepest(e)
        return e

这会达到递归限制。有什么指针吗?我已经挣扎了几天。

感谢。

3 个答案:

答案 0 :(得分:1)

自己使用堆栈来模仿递归堆栈。

tovisit = [ L ]
current_deepest = None
while tovisit != []:
     v = tovisit.pop()
     for e in v:
         tovisit.append(e)

你需要在这里添加你自己的逻辑(你当前的函数是错误的,你在for循环中返回e)。

答案 1 :(得分:0)

这是我的解决方案。你的get_deepest()调用没有返回任何内容,因此存在逻辑错误,并且它会继续深入。

Lst = ['o', ([], [(1, 'V'), (-1, 'C')]), ['o', ['o', (['prefers'], [(1, 'D'), (1, 'D'), (-1, 'V')]), ['o', (['the'], [(1, 'N'), (-1, 'D')]), (['beer'], [(-1, 'N')])]], ['o', (['the'], [(1, 'N'), (-1, 'D')]), (['king'], [(-1, 'N')])]]]

def get_dpst(L, maxdepth):
    deepest_tup = (L, maxdepth)
    for e in L:
        is_list = any(isinstance(e,list) for e in L)
        if is_list:
            tup = get_dpst(e, maxdepth+1)
            if tup[1] > deepest_tup[1]:
                deepest_tup = tup
    return deepest_tup

def get_deepest(L):
    tup = get_dpst(L, 0)
    return tup[0]

def printlist(lst):
    print '[%s]' % ', '.join(map(str, lst))

printlist(get_deepest(Lst))

或在函数中定义函数。

Lst = ['o', ([], [(1, 'V'), (-1, 'C')]), ['o', ['o', (['prefers'], [(1, 'D'), (1, 'D'), (-1, 'V')]), ['o', (['the'], [(1, 'N'), (-1, 'D')]), (['beer'], [(-1, 'N')])]], ['o', (['the'], [(1, 'N'), (-1, 'D')]), (['king'], [(-1, 'N')])]]]

def get_deepest(L):
    def get_dpst(L, maxdepth):
        deepest_tup = (L, maxdepth)
        for e in L:
            is_list = any(isinstance(e,list) for e in L)
            if is_list:
                tup = get_dpst(e, maxdepth+1)
                if tup[1] > deepest_tup[1]:
                    deepest_tup = tup
        return deepest_tup
    tup = get_dpst(L, 0)
    return tup[0]

def printlist(lst):
    print '[%s]' % ', '.join(map(str, lst))

printlist(get_deepest(Lst))

答案 2 :(得分:0)

L = ['o', ([], [(1, 'V'), (-1, 'C')]), ['o', ['o', (['prefers'], [(1, 'D'), (1, 'D'), (-1, 'V')]), ['o', (['the'], [(1, 'N'), (-1, 'D')]), (['beer'], [(-1, 'N')])]], ['o', (['the'], [(1, 'N'), (-1, 'D')]), (['king'], [(-1, 'N')])]]] 
max_depth = -1
deepest_list = None
def get_deepest(L,depth=0):
    global max_depth, deepest_list
    if depth > max_depth:
        max_depth = depth
        deepest_list = L
    for x in L:
        if isinstance(x,list):
            get_deepest(x,depth+1)
get_deepest(L)
print deepest_list

此代码被黑客攻击,并且必须有一种方法可以在没有全局变量的情况下执行此操作。顺便说一句,我认为递归对于中等大小的问题是可以的。