Python - 水平打印两个字符串,带|

时间:2014-10-17 16:55:46

标签: python string printing alignment

我有一个小的格式问题,我似乎无法解决。我有一些长串,以DNA序列的形式。我将每个列表添加到一个单独的列表中,每个列表中的每个字母都是单独的项目。它们长度不等,所以我附加了#34; N""到两者中较短的一个。

例如:

seq1 = [' A',' T',' G',' G',' A' ,' C'' G',' C',' A'] seq2 = [' A',' T',' G',' G',' C',&# 39; T',' G']

seq2成为:[' A',' T',' G',' G',' C&#39 ;,' T',' G',' N' N' N']

目前,在比较每个列表中的字母后,我得到:

ATGG - G -

其中' - '是字母中的不匹配(包括" N'#34;)。

理想情况下,我想要打印的是:

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

我在打印语句结束时一直在玩新的行字符逗号,但是我无法让它工作。我想在每一行的序列上打印一个标识符。

这里是用于比较两个序列的函数:

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)

目前,我只是打印&#34;底部&#34;我要打印的部分内容。

感谢所有帮助。

3 个答案:

答案 0 :(得分:1)

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

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

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

有点hacky,但完成工作。 format()的参数在给定的字符串中按顺序替换{}。我明白了:

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

答案 1 :(得分:1)

你总是可以尝试像下面那样简单的东西,它不会假设相同的大小,但你可以根据需要调整它。

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

答案 2 :(得分: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。通常在序列比对中,只显示匹配核苷酸的条|。解决方案非常简单,你应该能够弄清楚(如果你有麻烦,虽然让我知道)。