我有一个小的格式问题,我似乎无法解决。我有一些长串,以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;我要打印的部分内容。
感谢所有帮助。
答案 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。通常在序列比对中,只显示匹配核苷酸的条|
。解决方案非常简单,你应该能够弄清楚(如果你有麻烦,虽然让我知道)。