将字符串转换为嵌套元组:Python

3 投票
3 回答
739 浏览
提问于 2025-04-18 08:20

我有一个看起来像这样的字符串:

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']

撰写回答