簡體   English   中英

如何使用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. 解析輸入;
  2. 構造新的無序字符串;
  3. 輸出新文件。

(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.

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