使用Python在迭代创建的嵌套列表中选择上面的级别

使用Python在迭代创建的嵌套列表中选择上面的级别,python,list,python-3.x,nested,Python,List,Python 3.x,Nested,我在清单上搜罗了这么多问题,却找不到我想要的 我有一个字符串,其中大括号包含一些值,还有一些嵌套的大括号对包含值。我不知道结构嵌套的最深层次,但它可能看起来像这样: {121{12}12{211}2} 我希望迭代该字符串,并以类似于以下伪代码的方式将其传输到嵌套列表: for i in thestring if there is a leftbrace { start a new list inside the current list elseif there is a rightbrace

我在清单上搜罗了这么多问题,却找不到我想要的

我有一个字符串,其中大括号包含一些值,还有一些嵌套的大括号对包含值。我不知道结构嵌套的最深层次,但它可能看起来像这样:

{121{12}12{211}2}

我希望迭代该字符串,并以类似于以下伪代码的方式将其传输到嵌套列表:

for i in thestring
if there is a leftbrace { start a new list inside the current list
elseif there is a rightbrace } close the current list and select the list on the level above
else add i to currently selected list
我不知道如何提升列表级别并关闭当前子列表

def listify(s):
    i = iter(s)
    l = []
    for c in i:
        if c == '{':
            l.append(listify(i))
        elif c == '}':
            return l
        else:
            l.append(c)
    return l[0]
诀窍是使用递归函数,以便堆栈负责跟踪您所在的列表。我们使用
iter
,这样我们就可以将字符串传递给递归调用,而不需要我们已经处理过的字母

>>>listify(s)
['1', '2', '1', ['1', '2'], '1', '2', ['2', '1', '1'], '2']

下面是使用正则表达式和ast.literal\u eval创建一组元组的一种方法:

In [78]: s = "{121{12}12{211}2}"

In [79]: new = re.sub(r'(})(?!$)|(?<!^)({)',lambda x : {'{': ',(', '}': ',),'}[x.group(0)], s)

In [80]: ast.literal_eval(new)
Out[80]: {121, (211,), 2, 12, (12,)}
[78]中的
s=“{121{12}12{211}2}”

在[79]:new=re.sub(r'(})(?!$)|(?您可能需要一个递归解析函数。那么我如何访问使用该函数创建的特定嵌套列表?比如说,我是否要访问底层第二个子列表中的第二项?(在本例中为1-和右侧第三个数字)列表在这方面不是很好。听起来你可能想要一个更像树的结构。我在python中看到了很多构建树的包,但是有树数据类型吗?因为我更喜欢不使用其他人的包,而只使用列表和我自己的父/子索引系统