![](/img/trans.png)
[英]how to compare and merge two list according to its sequence in python?
[英]How to align and compare two elements (sequence) in a list using python
這是我的問題:
我有一個看起來像這樣的文件:
103L順序:MNIFEMLRIDEGLRLKIYKDTEGYYTIGIGHLLTKSPSLNSLDAAKSELDKAIGRNTNGVITKDEAEKLFNQDVDAAVRGILRNAKLKPVYDSLDAVRRAALINMVFQMGETGVAGFTNSLRMLQQKRWDEAAVNLAKSRWYNQTPNRAKRVITTFRTGTWDAY -------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------- XX
它包含名稱,在這種情況下為103L。 具有“ Sequence:”標簽的蛋白質序列; 無序區域,在“無序:”之后。 “-”表示此位置是有序的,“ X”表示此特定位置是無序的。 例如,在無序狀態下的最后兩個“ XX”表示蛋白質序列的后兩個位置是無序的,即“ NL”。 使用分割方法后,它看起來像這樣:
['> 103L','Sequence:','MNIFEMLRIDEGLRLKIYKDTEGYYTIGIGHLLTKSPSLNSLDAAKSELDKAIGRNTNGVITKDEAEKLFNQDVDAAVRGILRNAKLKPVYDSLDAVRRAALINMVFQMGETGVAGFTNSLRMLQQKKDEDEAVNLAKSRWYNQTPNRAKRVIT ----- XXXXXX -------------------------------------------- -------------------------------------------------- ------------------------------- XX']
我想使用python查找無序序列及其位置。 因此,最終文件應如下所示:名稱序列:“真實序列”亂序:position(Posi)殘差名稱(R)以103L為例:
103L序列:MNIFEMLRIDEGLRLKIYKDTEGYYTIGIGHLLTKSPSLNSLDAAKSELDKAIGRNTNGVITKDEAEKLFNQDVDAAVRGILRNAKLKPVYDSLDAVRRAALINMVFQMGETGVAGFTNSLRMLQQKRWDEAAVNLAKSRWYNQTPNRAKRVITTFRTGTWDAYKNL 34 S N L S 37 K 37 S 37 L 34
我是python的新手,真的希望有人可以幫助我,非常感謝!!!
假設我們在一個變量中有split命令的結果
split_list = ['>103L', 'Sequence:', 'MNIFEMLRIDEGLRLKIYKDTEGYYTIGIGHLLTKSPSLNSLDAAKSELDKAIGRNTNGVITKDEAEKLFNQDVDAAVRGILRNAKLKPVYDSLDAVRRAALINMVFQMGETGVAGFTNSLRMLQQKRWDEAAVNLAKSRWYNQTPNRAKRVITTFRTGTWDAYKNL', 'Disorder:', '----------------------------------XXXXXX-----------------------------------------------------------------------------------------------------------------------------XX']
讓我們只處理重要的項目2和4
res_name = split_list[2] # ( i.e. 'MNIFEML...' )
disorder = split_list[4] # ( i.e. '-----...XXX')
您可以像這樣關聯兩個數組的元素。
sets = []
for i,c in enumerate( disorder ):
if c == 'X':
sets.append( (i, res_name[i]) )
Python中的enumerate命令遍歷類似對象的列表,並為每個混亂成員返回一個索引和一個項(i,c)。 在該操作結束時,集合將包含我們所要查找的元組,“ X”無序出現的索引號以及res_name中的相應殘基。
sets = [(34,'K'), (35,'S') ... ]
如果您想使用另一種不錯的Python功能,則可以使用所謂的列表推導功能在一行中構造集合,
sets = [ (i,res_name[i]) for i,c in enumerate(disorder) if c=='X' ]
這是一種構建列表的快速方法,並且比循環更有效,盡管如示例所示,差異對於100個項目的數量無關緊要。 剩下的唯一事情就是將這個新數據寫入文件。 我們可以創建另一個列表,然后將各個片段之間留有空格,以所需的格式創建字符串。 對於列表中的每個元組,我們都希望索引的字符串版本和殘差名稱(已經是字符串)。 可以這樣列出來,
txt = ' '.join( [str(t[0]) + ' ' + t[1] for t in sets] )
變量txt現在等於
>>> txt
'34 K 35 S 36 P 37 S 38 L 39 N 165 N 166 L'
要寫出指定格式的文件,可以執行以下操作:
f = open( 'test.out', 'w' )
f.write( ' '.join(split_list[0:2]) + '\n' )
f.write( split_list[2] + ' Disorder: Posi R ' + txt )
f.close()
第一個寫命令將'> 103L Sequence:'放在第一行,並添加一個新行字符。 第二個輸出原始的殘基序列和我們在上面創建的txt變量。
您可以將其分為三個不同的部分:
(1)和(3)非常簡單,因此我將重點介紹(2)。 您需要做的主要事情是遍歷“混亂字符串”,您可以在其中訪問每個位置的字符以及位置本身。 一種方法是使用enumerate
:
for i, x in enumerate(S)
它為字符串S
每個位置(存儲在i
)和字符(存儲在x
)提供了一個生成器 。 一旦有了這些,您需要做的就是在無序字符串具有"X"
的位置將位置和字符記錄在seq
。 在Python中,這可能類似於:
if (x == 'X'):
new_disorder.append( "{} {}".format(i, seq[i]) )
我們將結果格式化為字符串,例如“ 34 R”。
這是一個完整的示例:
# Parse the file which was already split into split_list
split_list = ['>103L', 'Sequence:', 'MNIFEMLRIDEGLRLKIYKDTEGYYTIGIGHLLTKSPSLNSLDAAKSELDKAIGRNTNGVITKDEAEKLFNQDVDAAVRGILRNAKLKPVYDSLDAVRRAALINMVFQMGETGVAGFTNSLRMLQQKRWDEAAVNLAKSRWYNQTPNRAKRVITTFRTGTWDAYKNL', 'Disorder:', '----------------------------------XXXXXX-----------------------------------------------------------------------------------------------------------------------------XX']
header = split_list[0] + " " + split_list[1]
seq = split_list[2]
disorder = split_list[4]
# Create the new disorder string
new_disorder = ["Disorder: Posi R"]
for i, x in enumerate(disorder):
if x == "X":
# Appends of the form: "AminoAcid Position"
new_disorder.append( "{} {}".format(i, seq[i]) )
new_disorder = " ".join(new_disorder)
# Output the modified file
open("seq2.txt", "w").write( "\n".join([header, seq, new_disorder]))
請注意,我得到的輸出與您給出的示例略有不同:
103L Sequence:
MNIFEMLRIDEGLRLKIYKDTEGYYTIGIGHLLTKSPSLNSLDAAKSELDKAIGRNTNGVITKDEAEKLFNQDVDAAVRGILRNAKLKPVYDSLDAVRRAALINMVFQMGETGVAGFTNSLRMLQQKRWDEAAVNLAKSRWYNQTPNRAKRVITTFRTGTWDAYKNL
Disorder: Posi R 34 K 35 S 36 P 37 S 38 L 39 N 165 N 166 L
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.