python - 递归展平列表,跟踪递归深度
问题描述
我有一个任意列表列表,我的目标是展平该列表并返回我从中提取每个元素的级别。我应该说简单列表包含这样的元组:
[(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}]
推荐阅读
- blockchain - 超级账本和 ICO 代币
- javascript - Twitter API - 发布收藏夹/创建特定速率限制
- html - 通过 ASP 中的类标签而不是通过 ID 标签隐藏/显示 HTML div
- list - Haskell - 根据列表索引重复列表的元素
- java - 在 Intellij IDEA 异常断点条件下调用自定义函数
- c# - 使用 Dropbox .NET SDK 上传文件未完成
- jquery - 使用 JSON 数组和对象
- javascript - React Native 的功能不会更新状态/不会改变 UI
- html - 如何将文本放置在与图像相同的高度
- python-3.x - 是否可以(永久)更改 matplotlib 图的默认样式和大小(在 Jupyer 笔记本中内联绘制)?