如何在python中将元组的字符串转换为列表?

2024-09-28 15:38:10 发布

您现在位置:Python中文网/ 问答频道 /正文

所以这个标题听起来很奇怪,因为也许我的问题很奇怪。。。我有一个.txt文件,其中有来自不同程序的数千行机器输出,格式如下:

candidates(6,1,0,5,[ev(-1000,'C0009814','Stenosis','Acquired stenosis',[stenosis],[patf])])

基本上,我们有“candidates”标记一个元组的开始,“ev”标记一个元素列表中第二个元组的开始。当我将所有这些从文件读入python时,它以字符串的形式读入。但是我需要一个对象,这样我就可以访问元组的第n个索引。真的,我很高兴能找到一种方法从这个字符串中一致地获得ev()元组的最后一个值,在本例中是“patf”。你知道吗

我曾考虑过在“,”上拆分,但这并不总是成功的,因为列表“[狭窄]”中的列表有时会有像“[反流,主动脉]”这样的值。这个额外的“,”将列表索引抛出1,因此它将返回“astorial]”,而不是“[patf]”。你知道吗

请让我知道,如果我可以澄清任何事情,或如果我认为一些知识是理所当然的,需要说,才能解决这个问题。非常感谢。我还包括下面的第二个示例,它说明了在','上拆分的问题。你知道吗

candidates(8,1,0,7,[ev(-875,'C0003501','Aortic Valve','Aortic valve structure',[aortic,valve],[bpoc])])

编辑:我想对象不需要是列表。相同格式的元组工作得很好。只要我能为我需要的信息不断引用一个索引。谢谢!你知道吗

编辑2:我使用python2.7.6


Tags: 对象字符串标记txt编辑标题列表格式
3条回答

如果您的数据总是以相同的方式格式化,那么最快的方法就是使用正则表达式(modulere),如果您知道如何进行格式化的话。你知道吗

否则,这是一个相当难看的黑客,您可以尝试使用eval来“解析”数据。举个例子:

eval_globals = {
    "candidates": lambda *args: args,
    "ev": lambda *args: args,
    "aortic": "aortic",
    "valve": "valve",
    "bpoc": "bpoc",
    # Add more of the keywords you need here
}
result = eval(line, eval_globals)        

就在[。因此,您可以执行s.split('[')[-1].split(']')[0],其中s是文件中的一行。。。你知道吗

你有一个嵌套的语法,你正在试图分析。尽管它的范围很窄,所以可以构造regex来处理它,但它将是脆弱的。就像,真的脆弱。你知道吗

尝试使用ast。这变得有点复杂,所以我将尝试(哈哈)通过一个例子。太长了,读不下去了。你知道吗

我们正在列表节点中查找一个名称,因此可以从那里开始。你知道吗

import ast

s = "candidates(6,1,0,5,[ev(-1000,'C0009814','Stenosis','Acquired stenosis',[stenosis],[patf])])"

mod = ast.parse(s)

for node in ast.walk(mod):
    if isinstance(node, ast.List):
        print(node, list(ast.iter_child_nodes(node)))

<_ast.List object at 0xb3f2ddec> [<_ast.Call object at 0xb3f2de0c>, <_ast.Load object at 0xb712756c>]
<_ast.List object at 0xb3f2deec> [<_ast.Name object at 0xb3f2df0c>, <_ast.Load object at 0xb712756c>]
<_ast.List object at 0xb3f2df2c> [<_ast.Name object at 0xb3f2df4c>, <_ast.Load object at 0xb712756c>]

我们看到语法树中有三个ast.List节点。第一个是调用ev的外部列表,两个内部列表将包含那些空的ast.Name节点。这就是我们想要的-你特别想要第二个。你知道吗


<强> TL;博士跳过<<强>

我们可以让这一切变得更加简单,我只是简单介绍一下我个人是如何探索这个语法树的。这里有一个简单的例子:

s = "candidates(6,1,0,5,[ev(-1000,'C0009814','Stenosis','Acquired stenosis',[stenosis],[patf])])"

mod = ast.parse(s)

[next(ast.iter_fields(node)) for node in ast.walk(mod) if isinstance(node, ast.Name)]
Out[62]: [('id', 'candidates'), ('id', 'ev'), ('id', 'stenosis'), ('id', 'patf')]

所以只要抓住最后一个元素的第二个索引,这就是你的字符串。这种方法也适用于您的另一个示例:

s = "candidates(8,1,0,7,[ev(-875,'C0003501','Aortic Valve','Aortic valve structure',[aortic,valve],[bpoc])])"

mod = ast.parse(s)

[next(ast.iter_fields(node)) for node in ast.walk(mod) if isinstance(node, ast.Name)]
Out[65]: 
[('id', 'candidates'),
 ('id', 'ev'),
 ('id', 'aortic'),
 ('id', 'valve'),
 ('id', 'bpoc')]

您可以使用这种方法从语法树中获取任何想要的元素。只需使用ast.iter_fieldsast.iter_child_nodes探索ast.walk的输出。你知道吗

相关问题 更多 >