もう少し考えてみたら、文字列全体から始まっていない限り、最長の回文を見つけたかどうか分からず、回文を見つけるか、もう文字列が残っていない。今sample
に回文を見つける
# sample is a bit longer then the original, I added
# some other characters to the beginning of the string
sample = "AATTAAAAAGGGCCCTTTAAAGGGCCCTTTAAAGGGCCCTTT"
nucleotide_map = {'A':'T', 'T':'A', 'G':'C', 'C':'G'}
# simple function to test if a string is a palindrome
def is_palindrome(st, start, end):
# unlike conventional palindromes, genetic
# palindromes must be of even length
if (end <= start) or ((end-start) % 2 == 0):
return False
s,e = start,end
while e > s:
if nucleotide_map[st[s]] != st[e]:
return False
s += 1
e -= 1
return True
def find_longest_palindrome(st, loc):
s,e = loc, len(st)-1
while e > s:
if is_palindrome(st, s, e):
return st[s:e+1], e+1
e -= 1
return '',loc
だけです:
loc = 0
FIND_OVERLAPPING = False
while loc <= len(sample):
pal, tmploc = find_longest_palindrome(sample, loc)
if pal:
print(pal, loc, len(pal))
# advance to next location to look for palindromes
if FIND_OVERLAPPING:
loc += (tmploc-loc)/2
else:
loc = tmploc
else:
loc += 1
私は、重複回文を見つけることにかなり右テイクを持っているかわかりません。 locを増やしたくない場合や、縮まったすべての症例を取得するだけです。つまり、AAGAATTCTTの回文用の場合は、AGAATTCT、GAATTC、AATT、およびATも取得します。ここで
はpyparsingパーサにこれをステッチする一つの方法です:
from pyparsing import *
def getAllPalindromes(s,loc,t):
FIND_OVERLAPPING = False
ret = []
sample = t[0]
while loc <= len(sample):
pal, tmploc = find_longest_palindrome(sample, loc)
if pal:
ret.append((pal, loc))
# advance to next location to look for palindromes
if FIND_OVERLAPPING:
loc += (tmploc-loc)/2
else:
loc = tmploc
else:
loc += 1
return ret
palin = Word('AGCT').setParseAction(getAllPalindromes)
palin.parseString(sample).pprint()
は結果を与える:私はこの使用して6ワーカープロセスを実行した
[('AATT', 0), ('AAAGGGCCCTTTAAAGGGCCCTTTAAAGGGCCCTTT', 6)]
EDIT
をこのFASTAファイル(http://toxodb.org/common/downloads/Current_Release/Tgondii/fasta/ToxoDB-28_Tgondii_ESTs.fasta)に対するこのスクリプトのマルチプロセッシング・バージョンは、最初にFASTA formaを処理した後各ラップされた複数行のシーケンスを単一の文字列に変換します。 147151配列では、スクリプトは、20分以上の長さのパリンドロームを22分で検出した。
ATATATATATATATATATATATATATATATATATATATATATATATATATATATATATAT
CATATATATATATATATATATATATATATATATATATATATATATATATATATATATATG
CCCCCCCCCCCCCCCCCCCCCCCCCGGGGGGGGGGGGGGGGGGGGGGGGG
CCTCGTGCCGAATTCGGCACGAGGCCTCGTGCCGAATTCGGCACGAGG
CTCGTGCCGAATTCGGCACGAGCTCGTGCCGAATTCGGCACGAG
AAAAAAAAAAAAAAAAAACTCGAGTTTTTTTTTTTTTTTTTT
GGCACGAGGCCTCGTGCCGAATTCGGCACGAGGCCTCGTGCC
TTTATATATAAATATTTATATATAAATATTTATATATAAA
私はこのスタイルのパリンドロームに精通していません - DNA分析は異なる定義を使用していますか?他のフィールドでは、回文は、文字列全体が逆の場合に文字が同じである単語または文です。あなたのサンプルでは、唯一の回文は、 "AAA"、 "GGG"、 "CCC"などのグループであり、実際に回文が進むにつれてかなり退化しています。 (私は、 "AAGAACCCCGGTTGGCCCCAAGAA"のようなものを期待していました。これは、同じ前方と後方を読み取ります。)また、なぜあなたは 'locatedExpr'を使用していますか?一致するロジックは変更されず、マッチの開始/終了位置にのみ注釈が付けられます。 – PaulMcG
"*遺伝学の文脈におけるパリンドロームの意味は、単語や文章で使用される定義とは若干異なります。" - https://en.wikipedia.org/wiki/Palindromic_sequence –
@user、あなたのサンプルコードは不完全です。エラーを示す短い、完全な、スタンドアロンのプログラムを制作できますか?詳細は、[mcve]を参照してください。 –