gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:18:56 25 4
gpt4 key购买 nike

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

例如:

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--

我一直在打印语句末尾使用换行符逗号,但是我无法让它工作。我想在其序列的同一行上打印每个标识符的标识符。

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

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)

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

感谢所有帮助。

最佳答案

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

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. 通常,在序列比对中,仅显示| 条来表示匹配核苷酸。解决方案非常简单,您应该能够弄清楚(如果您遇到问题,请告诉我)。

关于Python - 水平打印两个字符串,带有 |,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26429879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com