2015-02-12 81 views
1

我試圖從我的肽中生成所有循環組合的譜圖。生成循環譜

這是我的線性頻譜的代碼:

#For example: LEQN 
#L:113 E:129 Q:128 N:114 
    peptide = [113,129,128,114] 
     for a in peptide: 
      for i in peptide[b:]: 
       s+= i 
       spectrum.append(s) 
      s=0 
      b += 1 

spectrum.sort() 
print spectrum 

輸出: [113,114,128,129,242,242,257,370,371,484]

我(113),E(129),Q(128),N(114),LE(113 + 129),LEQ(113 + 129 + 128),LEQN(113 + 129 + 128 + 114) ),EQN(129 + 128),EQN(129 + 128 + 114),QN(128 + 114)

但是缺失QNL(128 + 113 + 114),NL (114 + 113),NLE(114 + 113 + 129)

Ex。 QNL應該是128 + 114 + 113,它是元素2,3和1的總和。 NL是114 + 133,它是元素3和0的總和.NLE是113 + 114 + 129,它是元素3,0,1。

*我不需要添加EQNL或QNLE,因爲它們與LEQN完全相同。

*然而LE = 242和QN = 242具有相同的質量,但不是相同的東西。

預期輸出: 113,114,128,129,227(N + L),242,242,257,355(Q + N + L),356(N + L + E) 371,484

+0

這是有點不清楚你想要做什麼,你能指定預期的輸出和什麼是循環組合? – 2015-02-12 06:15:01

+0

難道你不能通過肽[0:4],肽[2:6],肽[3:6],肽[3:7]等串聯複製肽並循環嗎? – heathobrien 2015-02-12 09:55:09

+0

你是什麼意思@heathobrien?好的,我添加了更多細節以及我的預期輸出。 – deedle 2015-02-12 16:06:15

回答

1

如果我正確理解您的問題,您需要所有可能的子列表,每個長度最大爲peptide列表的長度,並且列表中的每個起始位置都包含在列表末尾。一種方法是從itertools使用cycleislice

from itertools import cycle, islice 

peptide = [113, 129, 128, 114] 
spectrum = [] 
for num in range(1, len(peptide)): 
    for start in range(len(peptide)): 
     group = islice(cycle(peptide), start, start + num) 
     spectrum.append(sum(group)) 
spectrum.append(sum(peptide)) # add the entire list only once 

這樣,sorted(spectrum)最終爲[113, 114, 128, 129, 227, 242, 242, 257, 355, 356, 370, 371, 484],這似乎是你想要的。然而,不知道這是如何縮放到更長的肽列表(我假設實際上這些列表有四個以上的元素)。

+0

我從中學到了很多,謝謝。 – deedle 2015-02-12 19:58:39

1
peptide = [113,129,128,114] 
peptide *= 2 
spectrum = [] 
for i in range(len(peptide)/2): 
    for j in range(i+1,i+4): 
     s = 0 
     for a in peptide[i:j]: 
      s+= a 
     spectrum.append(s) 
spectrum.sort() 
print spectrum 
+0

適當地,這不包括整個肽的總和 – heathobrien 2015-02-12 17:20:53

+0

此代碼會更有用,它有額外的評論和解釋。 – Trilarion 2015-02-12 21:10:37