【问题标题】:Unflattening a list in python在python中展开列表
【发布时间】:2015-02-21 14:59:28
【问题描述】:

问题:

编写一个名为“unflatten”的函数,它接受一个列表作为参数 并构造一个嵌套列表。

参数列表的格式如下:

整数项表示嵌套列表的开始非整数项 将是嵌套列表的内容例如,

[2, 'a', 3, 'b', 'c', 'd'] 转换为['a', ['b', 'c', 'd']] 第一个数字 2 表示上面的列表将包含 2 个项目。 'a' 是上层列表的第一项。数字 3 表示 包含 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']]]]]]

现在你可以看到,列表的长度在我的基本递归中不受控制,所以它只是在最后结束所有列表。

我不知道如何递归地或迭代地跟踪长度。如果您建议一种无需导入任何模块的方式来执行此操作,我会很高兴。

【问题讨论】:

  • 你必须考虑到如果isinstance(LIST[0], int)那么你接下来有LIST[0]元素。你可以使用辅助函数,unflatten(l) 可以调用unflatten_bis(l[1:],l[0])unflatten_bis 将完成所有工作。 (只是一个建议)

标签: python python-2.7 recursion iteration


【解决方案1】:

跟踪位置的一种方法是返回它。在下面的代码中,我使用了一个帮助函数,它返回部分构建的未展平列表以及展平列表中的当前索引。

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" ])

【讨论】:

    猜你喜欢
    • 2021-09-07
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 2012-04-25
    • 2015-12-01
    • 1970-01-01
    相关资源
    最近更新 更多