新程序员在这里。原谅任何偶尔的白痴。
我试图写一个小函数,它返回(任意大的)嵌套列表中最深的列表。子列表包含元组和字符串。
示例:
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
这会达到递归限制。有什么指针吗?我已经挣扎了几天。
感谢。
答案 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
此代码被黑客攻击,并且必须有一种方法可以在没有全局变量的情况下执行此操作。顺便说一句,我认为递归对于中等大小的问题是可以的。