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
,我们不必担心代码注入之类的问题。“它更安全,也同样简单。”威尔达席尔瓦,我明白了。我同意你的看法。谢谢你的解释。