2017-02-16 25 views
2

我已经浏览了列表上的很多问题,找不到要查找的内容。使用Python在迭代创建的嵌套列表中选择以上级别

我有一个大括号包装一些值和一些其他嵌套对包含值的大括号的字符串。我不知道该结构嵌套最深的层次,但它可能是这个样子:

{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 

我不知道如何去建立一个列表级别,并关闭当前子表

+0

你可能需要一个递归解析功能。 – TemporalWolf

回答

2
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'] 
+0

那么如何访问使用此创建的特定嵌套列表? – Davtho1983

+0

说如果我想访问底层第二个子列表中的第二个项目?(在这种情况下是1 - 和右边的第三个数字) – Davtho1983

+0

列表并不是那么好。这听起来像你可能想要一个更像树状结构 –

0

下面是使用正则表达式和ast.literal_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,)}