2014-10-17 50 views
1

我有一个小的格式问题,我似乎无法解决。我有一些长串,以DNA序列的形式出现。我将它们分别添加到一个单独的列表中,每个列表中的单个项目都包含字母。它们的长度不等,所以我在两者中较短的一个上附加了“N​​”。Python - 用|来水平打印两个字符串

例:

SEQ1 = [ 'A', 'T', 'G', 'G', 'A', 'C', 'G', 'C', 'A'] seq2 = ['A','T','G','G','C','T','G']

seq2变成:['A','T','G' , 'G', 'C', 'T', 'G', 'N', 'N']

目前,每个列表比较信后,我得到:

ATGG - G- -

其中' - '在字母(包括“N”)中是不匹配的。

理想是什么,我想打印的是:

seq1 ATGGACGCA 
     ||||||||| 
    seq2 ATGG--G-- 

我已经与打印语句结尾的新行字符逗号玩弄,但我无法得到它的工作。我想打印一个标识符为每个人在同一行上,因为它的顺序。

这里是用来将两个seqs比较功能:

def align_seqs(orf, query): 
     orf_base = list(orf) 
     query_base = list(query) 

     if len(query_base) > len(orf_base): 
       N = (len(query_base) - len(orf_base)) 
       for i in range(N): 
         orf_base.append("N") 
     elif len(query_base) < len(orf_base): 
       N = (len(orf_base) - len(query_base)) 
       for i in range(N): 
         query_base.append("N") 
     align = [] 

     for i in range(0, len(orf_base)): 
       if orf_base[i] == query_base[i]: 
         align.append(orf_base[i]) 
       else: 
         align.append("-") 

     print ''.join(align) 

目前,我只是打印什么,我想打印的“底部”部分。

所有帮助表示赞赏。

+0

为了得到字符对,也许你应该使用'zip(orf,query)'?那么知道打印什么会简单得多。 – 2014-10-17 17:01:05

+0

你的字符串很长吗? (即,当它进入一个新的行它不能很好地工作?) – Luigi 2014-10-17 17:35:17

+0

@Luigi,这些字符串很长。字符串1(缩小到需要的数量后)是1400个字符。字符串2是1900个字符。这就是为什么我需要将两端添加到字符串1. – 2014-10-17 18:35:19

回答

1

所以,这里是你的那对长字符串有效的解决方案:

s1 = 'ATAAGGATAAGGATAAGGATAAGGATAAGGATAAGGATAAGGATAAGGATAAGGATAAGG' 
s2 = 'A-AAGGA-AAGGA-AAGGA-AAGGA-AAGGA-AAGGA-AAGGA-AAGGA-AAGGA-AAGG' 

#assumes both sequences are of same length (post-alignment) 
def print_align(seq1, seq2, length): 
    while len(seq1) > 0: 
     print "seq1: " + seq1[:length-6] 
     print "  " + '|'*len(seq1[:length-6]) 
     print "seq2: " + seq2[:length-6] + "\n" 
     seq1 = seq1[length-6:] 
     seq2 = seq2[length-6:] 

print_align(s1, s2, 30) 

输出是:

seq1: ATAAGGATAAGGATAAGGATAAGG 
     |||||||||||||||||||||||| 
seq2: A-AAGGA-AAGGA-AAGGA-AAGG 

seq1: ATAAGGATAAGGATAAGGATAAGG 
     |||||||||||||||||||||||| 
seq2: A-AAGGA-AAGGA-AAGGA-AAGG 

seq1: ATAAGGATAAGG 
     |||||||||||| 
seq2: A-AAGGA-AAGG 

我相信这是你想要的。你可以玩length参数,以便正确显示这些线(每条线在达到该参数指定的长度后被切断)。例如,如果我叫print_align(s1, s2, 39)我得到:

seq1: ATAAGGATAAGGATAAGGATAAGGATAAGGATA 
     ||||||||||||||||||||||||||||||||| 
seq2: A-AAGGA-AAGGA-AAGGA-AAGGA-AAGGA-A 

seq1: AGGATAAGGATAAGGATAAGGATAAGG 
     ||||||||||||||||||||||||||| 
seq2: AGGA-AAGGA-AAGGA-AAGGA-AAGG 

这将有一个更合理的结果,当你有巨大的(> 1000bp)序列尝试。

请注意,该功能需要输入相同长度的两个序列,所以这只是在完成所有硬对齐工作后才打印出来。

P.S.通常在序列比对中,仅显示|核苷酸匹配。该解决方案非常简单,你应该能够弄清楚(如果你有麻烦,尽管让我知道)。

+0

美丽。一些间距问题,但我可以在“seq1”和“seq2”ID发生变化时插入标签。我很清楚使用该栏。我想用我的对齐方式来模拟传统的BLAST输出格式,并且目前想要在每个位置都有一个条形图用于可视化目的。谢谢你,路易吉。 – 2014-10-17 19:47:29

+0

只有一个问题,您是否从输入长度中减去6? – 2014-10-17 20:06:57

+0

因为''seq1:''是6个字符。这样的长度是绝对的 – Luigi 2014-10-17 20:29:03

1

如果我理解正确,这是一个格式问题。我建议看看str.format()。假设你可以将你的序列转换为字符串(就像你对seq2做的那样)。尝试:

seq1 = 'ATGGACGCA' 
seq2 = 'ATGG--G--' 

print(' seq1: {}\n  {}\n seq2: {}'.format(seq1, len(seq1)*'|', seq2)) 

有点哈克,但完成工作。 format()的参数在给定的字符串中按顺序替换{}。我得到:

seq1: ATGGACGCA 
     ||||||||| 
seq2: ATGG--G-- 
+0

我认为这个选项的实际字符串太长了。我将两个字符串打印出来,并在(不排队)之间是“|”。它看起来像我可能需要将字符串字符拆分成块 – 2014-10-17 18:50:18

1

你总是可以尝试下面这样简单的东西,它不会假定尺寸相同,但可以根据需要进行调整。

def printSequences(seq1, seq2): 
    print('seq1',seq1) 
    print(' ','|'*max(len(seq1),len(seq2))) 
    print('seq2',seq2) 
+0

不匹配怎么办?这就是' - '进来 – 2014-10-17 18:43:40