将列表的大字符串表示形式转换为列表Python 3

将列表的大字符串表示形式转换为列表Python 3,python,python-3.x,memory,Python,Python 3.x,Memory,我有一个以字符串表示的(大量)列表(不是这样,这只是一个示例) 我需要将其设置为列表类型: ['A', 'B', 'C'] 但如果我这样做: list("['A', 'B', 'C']") 显然,我会得到: ['[', "'", 'A', "'", ',', ' ', "'", 'B', "'", ',', ' ', "'", 'C', "'", ']'] 目前我正在使用: ast.literal_eval("['A', 'B', 'C']") 除了我的程序正在处理的列表是巨大的,字符串

我有一个以字符串表示的(大量)列表(不是这样,这只是一个示例)

我需要将其设置为列表类型:

['A', 'B', 'C']
但如果我这样做:

list("['A', 'B', 'C']")
显然,我会得到:

['[', "'", 'A', "'", ',', ' ', "'", 'B', "'", ',', ' ', "'", 'C', "'", ']']
目前我正在使用:

ast.literal_eval("['A', 'B', 'C']")
除了我的程序正在处理的列表是巨大的,字符串是数百万字节(测试字符串超过400万个字符)。因此,每当我尝试运行ast.literal_eval()时,它都会返回一个MemoryError


因此,我需要的是一种方法(它不必是pythonic的、优雅的,甚至是特别有效的),可以在不返回memerror的情况下将这些巨大的字符串放入列表。

使用Python内置的
eval(str)
函数可能会更走运

eval("['A', 'B', 'C']")
返回一个列表对象

['A', 'B', 'C']

输入数据格式并不完全标准,而且解析起来也不方便,特别是因为它变得非常庞大。根据数据来自何处,您应该开始将其保存在真实的数据库中,或者考虑如何使其可通过JSON解析。例如,如果我们将当前示例输入中的单引号替换为双引号,我们可以使用以下内容对其进行解析:


然后,一旦数据是JSON,这将是一个不同的、更常见的问题。您可以使用一个增量解析器(如)或事件驱动的解析器来避免内存错误。

您可以尝试使用基于迭代器接口和itertools模块的延迟解析

您可以使用,例如:

额外的改进是从文件中延迟加载巨大的字符串(因为所有处理都是延迟完成的)。显然,在对象表示中,它会被逗号打断(可能还有更多原因)

不管怎样,它仍然像是一个解决定义不清的问题的方法。根据基础数据的类型和外部要求(例如,文件应该是个人可读的,而不仅仅是机器可读的),您最好使用标准序列化格式(例如,等等)

>import ast
>>>input=“['A','B','C']”
>>>list=ast.literal\u eval(输入)
>>>输出=[i.strip()表示列表中的i]
>>>类型(输出)
>>>输出
['A','B','C']

好的,很抱歉浪费了你们的时间,伙计们,在尝试了所有其他方法后,我找到了一个真正不符合python但有效的解决方案:

str.split("', '")
移除末端大括号,因为任何一根弦都不会因为它的使用方式而突然出现。好了。

您可以使用非常棒的库(
pip-install-pyyaml

如果您正在读取文件,也可以执行以下操作:

>>> with open(myfile) as fid:
...     data = yaml.load(fid)

是一个长列表还是多个列表?有帮助吗?一个loooooong list@ironfisth您是否尝试删除大括号并使用split?我认为
json
可能是您的解决方案我不这么认为…这不是关于评估字符串…而是评估一个非常长的字符串(数百万字节),这将导致内存错误…是的,还有eval()是危险的,这就是为什么我第一次使用astplace@Arcayn以Python列表的完美格式字符串表示为例,未指定该字符串来自不受信任的源,因此使用
eval
并不安全。此外,还声明“我有一个……字符串”,这意味着该字符串已经存在于内存中。因此,我们应该避免创建它的副本或部分副本。但是我们必须根据请求在内存中创建一个列表,这将需要分配更多的内存。正如其他人所指出的,最好是从类似文件的对象中解析字符串,并且从一开始就不要将其加载到内存中?让它成为一个惰性函数并不更好,毕竟它给出了内存错误,可能是因为生成的列表太大。这屏蔽了两个内置函数,然后使用OP声明不起作用的确切方法。除了标题你还读了什么吗?
def lazy_to_list(input_string):
    iterable = iter(input_string)
    next(iterable)  # skip [
    l = []
    while True:
        value = ''.join(itertools.takewhile(lambda c: c != ',', iterable))
        if not value:
            break
        if value.endswith("]"):
            value = value.rstrip("]")
        l.append(eval(value))
    return l


N = 1000000
s = repr(list(range(N)))
assert lazy_to_list(s) == list(range(N))
>>> import ast
>>> input = "['A', 'B', 'C']"
>>> list = ast.literal_eval(input)
>>> output = [i.strip() for i in list]
>>> type(output)
<class 'list'>
>>> output
['A', 'B', 'C']
str.split("', '")
>>> import yaml
>>> yaml.load("['A', 'B', 'C']")
['A', 'B', 'C']
>>> with open(myfile) as fid:
...     data = yaml.load(fid)