首页 > 解决方案 > 递归展平列表,跟踪递归深度

问题描述

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

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

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

标签: pythonpython-3.xlistdictionary

解决方案


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

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

推荐阅读