递归扁平化列表,跟踪递归深度



我有一个任意列表列表,我的目标是扁平化该列表,并返回我从中提取每个元素的级别。我应该说简单列表包含这样的元组:

[(13,1), [(12,2), (14,1)], [[(11,2), (5,7)], (8,2)]]

我已经做的是通过实现这个递归方法来扁平化这个列表:

def unpack(x):
if x == []:
return x
if isinstance(x[0], list):
return unpack(x[0]) + unpack(x[1:])
return x[:1] + unpack(x[1:])

这将返回以下内容(这对我来说很好(:

[(13,1), (12,2), (14,1), (11,2), (5,7), (8,2)]

我最终想得到的是:

[{(13,1):1}, {(12,2):2}, {(14,1),2}, {(11,2):3}, {(5,7):3}, {(8,2):2}]

到目前为止,我已经尝试过这个:

def unpack(x,n=0):
if x == []:
return {x:n}
if isinstance(x[0], list):
return unpack(x[0],n+1) + unpack(x[1:],n+1)
return x[:1] + unpack(x[1:],n+1)

但是我收到一个错误说'TypeError: unhashable type: 'list''

您有任何想法吗 如何返回字典列表 ?

您以错误的方式修改了原始函数。您应该仅将解压缩的项目转换为字典:

def unpack(x, n=1):
if x == []:
return x
if isinstance(x[0], list):
return unpack(x[0], n + 1) + unpack(x[1:], n)
return [{x[0]: n}] + unpack(x[1:], n)

因此:

unpack([(13,1), [(12,2), (14,1)], [[(11,2), (5,7)], (8,2)]])

返回:

[{(13, 1): 1}, {(12, 2): 2}, {(14, 1): 2}, {(11, 2): 3}, {(5, 7): 3}, {(8, 2): 2}]

最新更新