簡體   English   中英

如何在python中將元組的字符串轉換為列表?

[英]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_fieldsast.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM