Python 从字符串列表(假定为元组)中删除引号
我正在从文件中抽出一行。行看起来像这样:Python 从字符串列表(假定为元组)中删除引号,python,Python,我正在从文件中抽出一行。行看起来像这样: ['(27.0, 168.0)', '(32.0, 550.0)', '(88.0, 835.0)', '(46.0, 660.0)', '(38.0, 430.0)', '(34.0, 285.0)', '(72.0, 701.0)', '(29.0, 434.0)', '(0, 2)'] 有没有办法将这些字符串转换成元组?我试着用x.strip()替换第行的x,但没有效果 提前谢谢。这对你有用吗 import ast string = "['(2
['(27.0, 168.0)', '(32.0, 550.0)', '(88.0, 835.0)', '(46.0, 660.0)', '(38.0, 430.0)', '(34.0, 285.0)', '(72.0, 701.0)', '(29.0, 434.0)', '(0, 2)']
有没有办法将这些字符串转换成元组?我试着用x.strip()替换第行的x
,但没有效果
提前谢谢。这对你有用吗
import ast
string = "['(27.0, 168.0)', '(32.0, 550.0)', '(88.0, 835.0)', '(46.0, 660.0)', '(38.0, 430.0)', '(34.0, 285.0)', '(72.0, 701.0)', '(29.0, 434.0)', '(0, 2)']"
string = string.replace("'", "")
string = ast.literal_eval(string)
输出为:
In : string
Out:
[(27.0, 168.0),
(32.0, 550.0),
(88.0, 835.0),
(46.0, 660.0),
(38.0, 430.0),
(34.0, 285.0),
(72.0, 701.0),
(29.0, 434.0),
(0, 2)]
In : type(string)
Out: list
In : [type(x) for x in string]
Out: [tuple, tuple, tuple, tuple, tuple, tuple, tuple, tuple, tuple]
ast
模块计算字符串,如果我理解正确,我认为这就是您要查找的字符串。这应该可以解决问题
from ast import literal_eval as make_tuple
a = ['(27.0, 168.0)', '(32.0, 550.0)', '(88.0, 835.0)', '(46.0, 660.0)', '(38.0, 430.0)', '(34.0, 285.0)', '(72.0, 701.0)', '(29.0, 434.0)', '(0, 2)']
b = [make_tuple(x.strip()) for x in a]
您可以使用
eval
轻松完成此操作
# bad practice
a = ['(27.0, 168.0)', '(32.0, 550.0)', '(88.0, 835.0)', '(46.0, 660.0)', '(38.0, 430.0)', '(34.0, 285.0)', '(72.0, 701.0)', '(29.0, 434.0)', '(0, 2)']
b = [eval(tuple_str.strip()) for tuple_str in a]
更新
正如您在下面的评论中所看到的,使用
literal\u eval
更安全 你是如何从文件中提取它们的,你能给我们看一下代码吗?是的,这是个骗局。谢谢没问题。如果您的问题已解决,请标记接受的答案。eval
在这里不是必需的,在这种情况下可能应该避免。@WillDaSilva您认为为什么应该避免这样做?在问题中,它表示输入来自文件。因为我们不知道是否可以信任文件的源,所以我们应该将其视为可能包含我们绝对不想调用eval
的恶意代码。通过使用ast
模块中的literal\u eval
,我们不必担心代码注入之类的问题。“它更安全,也同样简单。”威尔达席尔瓦,我明白了。我同意你的看法。谢谢你的解释。