[英]How to convert a string of a tuple into a list in python?
所以標題聽起來很奇怪,因為也許我的問題很奇怪...我有一個.txt文件,該文件包含來自另一程序的數千行機器輸出,格式如下:
candidates(6,1,0,5,[ev(-1000,'C0009814','Stenosis','Acquired stenosis',[stenosis],[patf])])
本質上,我們在單個元素列表中有“候選”標記了元組的開始,並有“ ev”標記了第二個元組的開始。 當我從文件中將所有這些讀入python時,它將作為字符串讀取。 但是我需要一個對象,以便可以訪問元組的第n個索引。 確實,我很高興能找到一種從該字符串(在本例中為“ patf”)中始終獲取ev()元組的最后一個值的方法。
我曾考慮過僅對“進行分割”,但這並不總是成功的,因為列表“ [狹窄]”中的列表有時可能具有“ [反流,主動脈]”之類的值。 多余的','會使列表索引減1,因此返回'aortic]'而不是'[patf]'。
請讓我知道我是否可以澄清任何事情,或者我認為在解決該問題之前需要說一些理所當然的知識。 非常感謝。 我還在下面提供了第二個示例,這些示例說明了對','進行拆分的問題。
candidates(8,1,0,7,[ev(-875,'C0003501','Aortic Valve','Aortic valve structure',[aortic,valve],[bpoc])])
編輯:我猜該對象不必是列表。 相同格式的元組效果很好。 只要我可以始終為我需要的信息引用一個索引。 謝謝!
編輯2:我使用python 2.7.6
您正在嘗試解析一個嵌套的語法。 盡管它的范圍很窄,所以可以構造正則表達式來處理它,但它會很脆弱。 喜歡, 真的很脆弱。
嘗試使用ast
。 這有點復雜,所以我將嘗試通過一個例子。 如果需要tl; dr,請跳到中間/結尾。
我們正在列表節點中尋找名稱,因此我們可以從此處開始。
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; dr在這里跳過
我們可以使這一切變得更加簡單,我只是逐步介紹了我個人探索此語法樹的方式。 這是一個單線:
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_fields
和ast.iter_child_nodes
探索ast.walk
的輸出。
如果您的數據始終采用相同的格式,則最快的方法是使用正則表達式(模塊re
)(如果您知道如何)。
否則,這是一個難看的駭客,您可以嘗試使用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是文件中的一行...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.