解析,拼接和构造嵌套字符串以在Python中列出

时间:2017-10-31 02:01:25

标签: python arrays python-2.7 list

由于我无法解释,我无法想象我会从中得到很多帮助。但是例如我有一个像这样的字符串:

s = "[1,[2,2,[3,4]],5]"

我需要将其转换为嵌套列表项

lst = ["1",["2","2",["3","4"]],"5"]

如果我要lst[1][2][0],它会返回'3'

我尝试这样做的方法是为' [']中的每个数字创建一个子字符串。并且字符串字符结束然后慢慢地将其嵌回

def ParseList(strlist):
    if '[' in strlist:
        print strlist
        return ParseList(GetBetweenChar(strlist,'[',None))
    else:
        return strlist

然而它返回:(虽然这可能是一个好的开始?我不知道在哪里继续)

[1,[2,2,[3,4]],5]
 1,[2,2,[3,4]],5
 2,2,[3,4]],
 3,4]]

我认为我会将其附加到列表项但我不知道如何...

5 个答案:

答案 0 :(得分:2)

您可以使用ast.literal_eval将字符串安全地转换为嵌套的整数列表。然后定义一个嵌套的map函数,将所有元素转换为字符串,同时保持嵌套结构。

from ast import literal_eval
s = "[1,[2,2,[3,4]],5]"
ls = literal_eval(s)

# yes I know there is something else called nmap 
def nmap(fn, iterable):
    res = []
    for i in iterable:
        if isinstance(i, list): # could be tuple or something else?
            res.append(nmap(fn, i))
        else:
            res.append(fn(i))
    return res

result = nmap(str, ls)

print(result)
print(result[1][2][0])

结果:

  

[' 1',[' 2',' 2',[' 3',' 4' ]],' 5']
  3

答案 1 :(得分:0)

您可以使用eval()。请注意确保字符串是安全的,因为eval会将字符串转换为有效的python代码。

>>> eval("[1,[2,2,[3,4]],5]")[1][2][0]
3

更多信息:What does Python's eval() do?

答案 2 :(得分:0)

如果你不是要求每个部分都是一个字符串,但你可以让数字成为数字,那么你可以使用json库:

>>> s = "[1,[2,2,[3,4]],5]"
>>> import json
>>> json.loads(s)
[1, [2, 2, [3, 4]], 5]

请注意,如果您的原始列表包含数字或布尔值,则它们将保留为数字或布尔值。这可能是你想要的,但如果你真的需要一切都是字符串,那么你可以通过嵌套数组递归并将str应用于所有内容(寻找"如何在Python中使用flatmap" )或在下面的评论部分请求进一步的帮助。

答案 3 :(得分:0)

您可以先围绕数字添加引号,然后评估列表:

s = "[1,[2,2,[3,4]],5]"
res = ''
for c in s:
    if c.isdigit():
        res += '"' + c + '"'
    else:
        res += c

s = eval(res)
s

输出:

['1', ['2', '2', ['3', '4']], '5']

这适用于单位数字;多个数字或浮点数需要更多的工作

答案 4 :(得分:0)

Eval对用户输入不安全。

您可以执行类似于python(2.6+)的操作:

>>> import ast
>>> s = "[1,[2,2,[3,4]],5]"
>>> lst = ast.literal_eval(s)
>>> str(lst[1][2][0])
'3'