Python-水平打印两个字符串,带有|
我有一个小的格式问题,我似乎无法解决。我有一些长字符串,以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”) 理想情况下,我希望打印的内容是: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-
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