【问题标题】:flat delimited list to nested multilevel list平面分隔列表到嵌套多级列表
【发布时间】:2014-12-03 17:53:45
【问题描述】:

我正在尝试从平面分隔列表中创建嵌套列表。 举个例子:

L1=[
'YYYYY', 'OPEN',  ' 111',   ' 222', 'CLOSE', 
'XXXX','OPEN', '  333', '  444', 'OPEN', '    555', '    666', 'CLOSE','CLOSE'
]

如何获得嵌套的多级列表:

L2=
[
['YYYYY',
' 111', 
' 222', 
], 
['XXXX',
'  333', 
['  444', 
'    555', 
'    666',
]
]
]

【问题讨论】:

  • 基于什么?我不知道使用什么标准来分解子列表。
  • @Cyber​​:大概是 OPEN 和 CLOSE 条目..
  • 哦,好吧,我知道他们现在在做什么了。

标签: python list nested


【解决方案1】:

使用堆栈:

def build_multilevel(entries):
    result = []
    stack = [result]
    for i, entry in enumerate(entries):
        if entry == 'OPEN':
            # convert last element of the top-most list on the stack
            # to a new, nested list, and push that new list on top
            stack[-1][-1] = [stack[-1][-1]]
            stack.append(stack[-1][-1])
        elif entry == 'CLOSE':
            stack.pop()
        else:
            stack[-1].append(entry)
    return result

演示:

>>> L1=[
... 'YYYYY', 'OPEN',  ' 111',   ' 222', 'CLOSE', 
... 'XXXX','OPEN', '  333', '  444', 'OPEN', '    555', '    666', 'CLOSE','CLOSE'
... ]
>>> def build_multilevel(entries):
...     result = []
...     stack = [result]
...     for i, entry in enumerate(entries):
...         if entry == 'OPEN':
...             # convert last element of the top-most list on the stack
...             # to a new, nested list, and push that new list on top
...             stack[-1][-1] = [stack[-1][-1]]
...             stack.append(stack[-1][-1])
...         elif entry == 'CLOSE':
...             stack.pop()
...         else:
...             stack[-1].append(entry)
...     return result
... 
>>> build_multilevel(L1)
[['YYYYY', ' 111', ' 222'], ['XXXX', '  333', ['  444', '    555', '    666']]]

【讨论】:

  • @JonClements:仅在移动客户端上,不在网页渲染中。
  • @JonClements:现在完全删除了 new 名称。
  • stack.pop() 删除堆栈中的最后一个条目
  • @OrangeFish:所以?你返回result,而不是堆栈。 OPENCLOSE 条目的数量确实需要平衡;您可以将stack.pop() 异常视为错误,因为这意味着CLOSE 事件多于OPEN 事件。
  • @MartijnPieters 谢谢!列表可以像指针一样工作,对我来说是新的
【解决方案2】:
def flat_list(_list):
    """

    :param _list:
    :return:
    """
    res = []
    if type(_list) is list:
        for item in _list:
            if type(item) is not list:
                res.append(item)
            else:
                [res.append(x) for x in flat_list(item)]
    else:
        res.append(_list)

    return res

【讨论】:

  • 即使它有效,稍微解释一下代码的作用可能会有所帮助。
猜你喜欢
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 2011-09-23
相关资源
最近更新 更多