我有一个任意列表列表,我的目标是弄平该列表,并返回从中提取每个元素的级别。我应该说,简单列表包含类似以下的元组:
[(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''
您有任何想法如何返回词典列表吗?
答案 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}]