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

3

我正在从文件中提取一行数据,这一行的格式如下:

['(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,但没有帮助。
提前致谢。

你是如何从文件中提取它们的?能否展示一下代码? - depperm
3个回答

3
这对您有用吗?
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]
< p > ast 模块评估字符串,如果我理解正确,这正是您要寻找的内容。


嗯,这个方法确实起作用了。谢谢! - Timofey Goritsky
没问题。如果您的问题已解决,请标记接受的答案。 - Luci

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]

1
你可以很容易地使用 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


在这种情况下,eval并不是必要的,而且可能应该避免使用。 - Will Da Silva
@WillDaSilva 你为什么认为那应该被避免? - tell k
问题中指出输入来自文件。由于我们不知道是否可以信任文件的来源,因此我们应该将其视为可能包含恶意代码,绝对不希望调用eval。通过使用ast模块中的literal_eval,我们不必担心诸如代码注入之类的问题。它更安全,同样简单。 - Will Da Silva
@WillDaSilva 我明白了。我同意你的说法。谢谢你耐心地解释。 - tell k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接