Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-水平打印两个字符串,带有|_Python_String_Printing_Alignment - Fatal编程技术网

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

Python-水平打印两个字符串,带有|,python,string,printing,alignment,Python,String,Printing,Alignment,我有一个小的格式问题,我似乎无法解决。我有一些长字符串,以DNA序列的形式。我将每个字母添加到一个单独的列表中,每个字母都是列表中的一个单独项目。它们的长度不等,所以我在两者中较短的一个后面加上了“N” 例: seq1=['A','T','G','G','A','C','G','C','A'] seq2=['A','T','G','G','C','T','G'] seq2变成:['A','T','G','C','T','G','N','N'] 目前,在比较每个列表中的字母后,我得到: ATGG-

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

例:

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

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

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

ATGG--G--

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

理想情况下,我希望打印的内容是:

  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)
def align_seqs(orf,查询):
orf_base=列表(orf)
查询\基本=列表(查询)
如果len(查询基数)>len(orf基数):
N=(len(查询基)-len(orf基))
对于范围(N)中的i:
orf_base.append(“N”)
elif len(查询基数)
目前,我只是打印我想要打印的内容的“底部”部分


非常感谢您的帮助。

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

有点老套,但能完成任务。format()的参数按给定字符串的顺序替换{}。我得到:

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

你可以试着做一些简单的事情,比如下面的事情,它不会假设相同的尺寸,但是你可以根据自己的喜好进行调整

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

因此,这里有一个适用于长字符串的解决方案:

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\u 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.通常在序列比对中,仅显示匹配核苷酸的条形码。解决方案非常简单,您应该能够找到它(如果您有throuble,请让我知道)。

要获得字符对,可能您应该使用
zip(orf,query)
?那么知道打印什么就简单多了。字符串太长了吗?(也就是说,当它转到一个新的行时,它不工作?@Luigi,字符串很长。字符串1(在我将其缩短到需要的长度后)是1400个字符。字符串2是1900个字符。这就是为什么我需要在字符串1中添加结尾。@GuillaumeLemaître在两个列表长度相同后,我曾考虑过压缩它们,但接下来如何打印所需内容?对于不匹配的内容呢?这就是“-”出现的原因,我认为实际字符串对于这个选项来说太长了。我打印了两个字符串,中间(没有对齐)是“|”的。看起来我可能需要将字符串字符分割成块Beautiful。有几个间距问题,但我可以在“seq1”和“seq2”ID发生变化时解决这些问题。我很清楚酒吧的用途。我想用我的对齐方式模拟传统的BLAST输出格式,目前,我想在每个位置都有一个条形图,以便可视化。谢谢你,路易吉。就一个问题,你为什么要从输入长度中减去6?因为
'seq1:'
是6个字符。这样长度是绝对的
seq1: ATAAGGATAAGGATAAGGATAAGGATAAGGATA
      |||||||||||||||||||||||||||||||||
seq2: A-AAGGA-AAGGA-AAGGA-AAGGA-AAGGA-A

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