我有一個這樣的串列:
test = ["Similar to Stxbp2: Syntaxin-binding protein 2 (Mus musculus)", "Protein of unknown function", "Similar to rab18b: Ras-related protein Rab-18-B (Danio rerio)", "Protein of unknown function", "Protein of unknown function"]
實際上,這個物件比這長得多,但這只是一個簡化的例子:我的目標是回圈test并編輯它到任何以“Similar to”開頭的值將直接回傳基因名稱的位置(例如,對于這個例子,我想替換串列中與此開頭的專案分別以“Stxb2”和“rab18b”開頭),我認為這需要指定從字符 12 開始并在到達冒號時結束。當一個值包含“未知功能的蛋白質”時,我希望它回傳“未知”。因此,輸出將是:
["Stxbp2", "Unknown", "rab18b", "Unknown", "Unknown"]
我知道這可能需要一個帶有 if 陳述句的 for 回圈來匹配每個條件,但是我很迷茫如何從那里開始以實作我正在尋找的結果。
uj5u.com熱心網友回復:
如果您不喜歡那些沒有正則運算式的變體:
def parse(x):
if x.startswith("Similar to"):
return x.split(":")[0].split()[-1]
if x.startswith("Protein of unknown function"):
return "Unknown"
raise ValueError(f"Unknown value: {x}")
print([parse(i) for i in test ])
輸出:
['Stxbp2', 'Unknown', 'rab18b', 'Unknown', 'Unknown']
uj5u.com熱心網友回復:
您可以嘗試通過匹配您的條件使用串列理解str.startswith,然后使用str.split拆分:
[x[11:].split(':', 1)[0] if x.startswith('Similar to') else 'Unknown' for x in test ]
# -> ['Stxbp2', 'Unknown', 'rab18b', 'Unknown', 'Unknown']
uj5u.com熱心網友回復:
我們可以使用串列推導和正則運算式替換:
test = ["Similar to Stxbp2: Syntaxin-binding protein 2 (Mus musculus)", "Protein of unknown function", "Similar to rab18b: Ras-related protein Rab-18-B (Danio rerio)", "Protein of unknown function", "Protein of unknown function"]
d = {'Similar to ': '', 'Protein of unknown function': 'unknown'}
regex = r'\b(?:' r'|'.join(d.keys()) r')\b'
output = [re.sub(regex, lambda m: d[m.group()], x).split(':')[0] for x in test]
print(output) # ['Stxbp2', 'unknown', 'rab18b', 'unknown', 'unknown']
這里的策略是字典包含搜索詞作為鍵,值作為替換。我們構建了一個鍵的正則運算式交替,然后re.sub()在回呼模式下使用。對于每個匹配的鍵,我們查找替換。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/530873.html
標籤:Python列表代替
上一篇:如何比較串列串列中的字串?
