将字符串转换为嵌套元组:Python
我有一个看起来像这样的字符串:
a = '((1,2),(2,3))'
我想以这样的方式访问它:
a[0] = (1,2)
a[0][1] = 2
我希望它能变成一个嵌套的元组形式。
但是我做的任何事情似乎都不管用。
如果它不是字符串,那就没问题。但因为我从其他地方获取的是字符串输入,所以我才想做这样的事情。
a = ((1,2),(2,3))
print a[0][1]
# prints 2 ..it works fine
编辑:
如果我把问题说得太简单了,我很抱歉。我的实际数据看起来是这样的:
a = '((243, SEA, ATL, 2013-08-12 05:50:00), (243, ATL, LAX, 2013-08-22 12:30:00),(243, LAX, SEA, 2013-05-29 18:10:00))'
这是我正在读取的字符串。我想通过括号 () 来拆分它,这样我就可以按时间顺序整理我的数据并重新排列。
有没有什么好主意可以实现这个?
实际上,literal_eval确实可以在我之前发布的示例数据上工作。但它在上述情况下不管用。
我现在的做法是:把 '),(' 替换成 ';',然后去掉所有的括号 '(',')',最后再通过 ';' 来拆分。
有没有更快或更好的方法?
3 个回答
0
还有一种解决方案是这样的:
for row in data.split('), ('):
for field in (f.strip() for f in row.split(',')):
print field
如果你的数据里有逗号,或者包含了UTF8编码的内容,建议使用csv模块。这个模块更聪明,能够处理引号和其他一些特殊情况。
7
ast
模块中的literal_eval
方法正是你需要的东西:
>>> import ast
>>> a = '((1,2),(2,3))'
>>> b = ast.literal_eval(a)
>>> b[0]
(1, 2)
>>> b[0][1]
2
0
如果你想把数据放在一个列表里,可以使用正则表达式(re):
a = '((243, SEA, ATL, 2013-08-12 05:50:00), (243, ATL, LAX, 2013-08-22 12:30:00),(243, LAX, SEA, 2013-05-29 18:10:00))'
import re
print re.findall("([^(]*)\)", a[1:-1])
['243, SEA, ATL, 2013-08-12 05:50:00', '243, ATL, LAX, 2013-08-22 12:30:00', '243, LAX, SEA, 2013-05-29 18:10:00']