0

リスト内のすべての項目は、文字列の 50 の長い部分文字列ごとに比較する必要があります。私が書いたコードは、より短い文字列の長さで動作していますが、文字列が非常に大きい場合 (例: 8800)、そうではありません。誰かがより良い方法を提案したり、コードをデバッグしたりできますか?

コード:

a_str = 'CGGACTCGACAGATGTGAAGAACGACAATGTGAAGACTCGACACGACAGAGTGAAGAGAAGAGGAAACATTGTAA'
a = 0
b = 5
c = 50
leng = len(a_str)
lengb = leng - b + 1
list1 = []
list2 = []
list3 = []
list4 = []
for i in a_str[a:lengb]:
    findstr = a_str[a:b]
    if findstr not in list2:
        count = a_str.count(findstr)
        list1 = [m.start() for m in re.finditer(findstr, a_str)]
        last = list1[-1]
        first = list1[0]
        diff = last - first
        if diff > 45:
            count = count - 1
        if count > 3:
            list2.append(findstr)
            list3.append(list1)
    a += 1
    b += 1

a = 0
dictionary = dict(zip(list2, list3))
for j in list2:
    for k in a_str[a:c]:
        if c < leng:
            str1 = a_str[a:c]
            if str1.count(j) == 4:
                list4.append(j)
    a += 1
    c += 1

print(list4)

8800、b=10、count1=17、c=588 の文字列の場合、c はループ中に 1161 までしか値を取りません。

長さ50のウィンドウ長で4回繰り返される長さ5の部分文字列が必要です(つまり、メイン文字列の50文字ごとに)

4

2 に答える 2

0

これにより、50 文字以内で少なくとも 4 回以上繰り返される (重複しない) 長さ 5 のすべての部分文字列が検索されます。結果のリストには重複がありません。

a_str = 'CGGACTCGACAGATGTGAAGAACGACAATGTGAAGACTCGACACGACAGAGTGAAGAGAAGAGGAAACATTGTAA'
b = 5      #length of substring
c = 50     #length of window
repeat = 4 #minimum number of repetitions

substrings = list({
    a_str[i:i+b]
    for i in range(len(a_str) - b)
    if a_str.count(a_str[i:i+b], i+b, i+c) >= repeat - 1
})
print(substrings)

私はこれがあなたが望むものだと信じています。そうでない場合はお知らせください。

['CGACA', 'GAAGA']
于 2013-11-14T05:24:45.700 に答える