【问题标题】:trying to parse a string and convert it to nested lists尝试解析字符串并将其转换为嵌套列表
【发布时间】:2013-12-16 06:27:42
【问题描述】:

我是 Python 新手,因此无法解决这个问题:

试图从这样的字符串:
mystring = '[ [10, 20], [20,50], [ [0,400], [50, 328], [22, 32] ], 30, 12 ]'

到由字符串表示的嵌套列表。基本上,反过来 str(mylist)

如果我尝试显而易见的选择
列表(我的字符串)

它将每个字符分成不同的元素,我失去了嵌套。

是否有我在文档中遗漏的 list 或 str 类型的属性(我使用 Python 3.3)?还是我需要编写一个执行此操作的函数?

另外,您将如何实现该功能?我不知道创建任意深度的嵌套列表需要什么...

谢谢,

--路易斯·H.

【问题讨论】:

  • 为什么一开始就有这个字符串?为什么你还没有相应的列表?你真正想做什么?

标签: python string list types


【解决方案1】:

在字符串上调用ast.literal_eval函数。

要自己实现它,可以使用递归函数将字符串转换为表示列表的字符串列表。然后这些字符串将被传递给函数等等。

如果我尝试显而易见的解决方案list(mystring),它会将每个字符分成不同的元素,我会失去嵌套。

这是因为list() 实际上从iterable 中生成了一个列表,list() 使用字符串的__iter__() 方法将其转换为迭代器。将字符串转换为迭代器时,会生成每个字符。

【讨论】:

【解决方案2】:

或者,如果您希望执行此操作以实现从字符串到对象的更一般的转换,我建议您使用json 模块。与字典一起使用,并返回经过验证的真实规范,可在整个开发人员和网络空间中轻松使用。

import json
nested_list = json.reads(mystring)
# You can even go the other way
mystring == json.dumps(nested_list)
>>> True

此外,还有一些方便的方法可以直接处理包含这种字符串表示的文件:

# Instead of
data_structure = json.loads(open(filename).read())
# Just
data_structure = json.load(filename)

使用 dump 而不是 load 反过来也是如此

如果您想知道为什么应该使用 json 而不是 ast.literal_eval(),这是一个非常成熟的观点,您应该阅读 this 问题。

【讨论】:

    猜你喜欢
    • 2014-09-18
    • 2016-02-08
    • 2019-04-24
    • 2021-11-25
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多