递归展平列表,跟踪递归深度

时间:2018-10-22 15:01:54

标签: python python-3.x list dictionary

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

[(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''

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

1 个答案:

答案 0 :(得分:0)

您以错误的方式修改了原始功能。您应该只将解包的项目转换为字典:

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