从字符串列表中删除引号(应该是元组)

时间:2017-06-08 13:45:47

标签: python

我从文件中取出一行。 Row看起来像这样:

['(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() for x in row,但它没有帮助。

提前致谢。

3 个答案:

答案 0 :(得分:2)

这对你有用吗?

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模块会评估我认为您正在寻找的字符串。

答案 1 :(得分:1)

这应该可以解决问题。

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]

答案 2 :(得分:0)

您可以使用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_eval更安全。