gpt4 book ai didi

python - ast.literal_eval() 支持 Python 2.7 中的集合文字?

转载 作者:太空狗 更新时间:2023-10-29 17:51:33 24 4
gpt4 key购买 nike

What’s New in Python 2.7文档它说对集合文字的支持是从 Python 3.1 向后移植的。然而,这种支持似乎并未扩展到 ast 模块的 literal_eval() 函数,如下所示。

这是故意的、疏忽的还是其他原因——从字符串表示形式创建文字集的最简洁的解决方法是什么? (我假设以下内容适用于 Python 3.1+,对吧?)

import ast
a_set = {1,2,3,4,5}
print(a_set)
print(ast.literal_eval('{1,2,3,4,5}'))

显示错误信息的输出:

set([1, 2, 3, 4, 5])
Traceback (most recent call last):
File "...\setliterals.py", line 4, in <module>
print ast.literal_eval('{1,2,3,4,5}')
File "...\Python\lib\ast.py", line 80, in literal_eval
return _convert(node_or_string)
File "...\Python\lib\ast.py", line 79, in _convert
raise ValueError('malformed string')
ValueError: malformed string

附言我能想到的唯一解决方法是使用 eval()

最佳答案

我一直在使用它来转换 pandas DataFrame 中的列 (df[col] = df[col].apply(to_set)。可能对发现这个问题的任何人都有用。它可能没有那么快,但它避免使用 eval

def to_set(set_str):
"""
Required to get around the lack of support for sets in ast.literal_eval.
It works by converting the string to a list and then to a set.

Parameters
----------
set_str : str
A string representation of a set.

Returns
-------
set

Raises
------
ValueError
"malformed string" if the string does not start with '{' and and end
with '}'.

"""
set_str = set_str.strip()
if not (set_str.startswith('{') and set_str.endswith('}')):
raise ValueError("malformed string")

olds, news = ['{', '}'] , ['[',']']
for old, new in izip(olds, news):
set_str = set_str.replace(old, new)

return set(literal_eval(set_str))

关于python - ast.literal_eval() 支持 Python 2.7 中的集合文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6078262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com