我目前正在使用Python中的递归函数,但是遇到了麻烦。如标题所述,问题在于返回任意嵌套列表的最大深度。
这是我到目前为止的内容:
def depthCount(lst):
'takes an arbitrarily nested list as a parameter and returns the maximum depth to which the list has nested sub-lists.'
var = 0
if len(lst) > 0:
if type(lst[0]) == list:
var += 1
depthCount(lst[1:])
else:
depthCount(lst[1:])
else:
return var
我觉得问题出在我的递归调用上(这可能很明显)。当列表到达末尾时,它的确会返回var,但是当我有一个非空列表时,事情就出错了。什么也没有退还。
我切片错了吗?我应该在递归调用中的分片之前做些什么吗?
问题可能也与我的基本情况有关。
最佳答案
如果它们只是嵌套列表,例如[[[], []], [], [[]]]
,这是一个不错的解决方案:
def depthCount(lst):
return 1 + max(map(depthCount, lst), default=0)
如果您不使用引入了
default
参数的Python 3.4,可以使用以下稍微的变化:def depthCount(lst):
return len(lst) and 1 + max(map(depthCount, lst))
它们的计数方式也不同。第一个将空列表视为深度1,第二个将深度列表视为0。不过,第一个易于调整,不过只需将默认值设为-1。
如果它们不只是嵌套列表(例如
[[[1], 'a', [-5.5]], [(6,3)], [['hi']]])
),则适用于以下内容:def depthCount(x):
return 1 + max(map(depthCount, x)) if x and isinstance(x, list) else 0
def depthCount(x):
return int(isinstance(x, list)) and len(x) and 1 + max(map(depthCount, x))
确保您了解后者的工作原理。如果您还不了解它,它将教您
and
在Python中的工作方式:-)接受“纯递归” 挑战:
def depthCount(x, depth=0):
if not x or not isinstance(x, list):
return depth
return max(depthCount(x[0], depth+1),
depthCount(x[1:], depth))
当然,额外的论点有点丑陋,但我认为可以。