问题:
编写一个名为“unflatten”的函数,它以列表作为参数 并构造一个嵌套列表。
参数列表的格式如下:
整数项表示嵌套列表的开始非整数项 将是嵌套列表的内容例如,
[2,'a',3,'b','c','d']被转换为['a',['b','c','d']] 第一个数字2表示上面的列表将包含2个项目。 'a'是此上排列表的第一项。数字3表示a 开始一个包含3个项目的新子列表。
示例运行:
>>> unflatten([2, 'x', 'y'])
['x', 'y']
>>> unflatten([ 3, "a", "b", 3, "t", "y", "u" ])
['a', 'b', ['t', 'y', 'u']]
>>> unflatten([ 4, "a", "b", 3, "c", "d", 2, "x", "y", 2, "w" , 3, "t", "y", "u" ])
['a', 'b', ['c', 'd', ['x', 'y']], ['w', ['t', 'y', 'u']]]
我做了一个简单的递归。这是我的代码:
def unflatten(LIST):
if not len(LIST):
return []
elif isinstance(LIST[0], int):
return [unflatten(LIST[1:])]
else:
return [LIST[0]] + unflatten(LIST[1:])
>>> unflatten([ 4, "a", "b", 3, "c", "d", 2, "x", "y", 2, "w" , 3, "t", "y", "u" ])
[['a', 'b', ['c', 'd', ['x', 'y', ['w', ['t', 'y', 'u']]]]]]
现在你可以看到,在我的基本递归中没有控制列表的长度,所以它只是结束了所有列表。
我不知道如何递归地或者可能迭代地跟踪长度。如果您在不导入任何模块的情况下建议这样做,我会很高兴。
答案 0 :(得分:3)
跟踪位置的一种方法是返回它。在下面的代码中,我使用一个辅助函数,它返回部分构建的unflattened列表以及展平列表中的当前索引。
def unflatten(l):
def helper(l, start):
if isinstance(l[start], int):
ret = []
start += 1
for _ in range(l[start - 1]):
sub, start = helper(l, start)
ret.append(sub)
return ret, start
else:
return l[start], start + 1
return helper(l, 0)[0]
print unflatten([2, 'x', 'y'])
print unflatten([ 3, "a", "b", 3, "t", "y", "u" ])
print unflatten([ 4, "a", "b", 3, "c", "d", 2, "x", "y", 2, "w" , 3, "t", "y", "u" ])