gpt4 book ai didi

python - 计算模式在字符串中连续出现的最大数量

转载 作者:行者123 更新时间:2023-12-01 06:32:47 25 4
gpt4 key购买 nike

我真的不知道如何修复,以便我的代码计算模式在字符串中的一行中出现的最大次数。我尝试过谷歌等,但所有答案并不真正符合我正在寻找的内容。也许我只是在谷歌上搜索错误的东西。无论如何,这是我的问题:

我有一个很长的文本文件,其中包含随机 DNA 序列,我已将其转换为字符串,这样我应该找到某些不同的 DNA 序列并计算每个序列连续出现的最高次数。为了更好地解释问题,我粘贴了我当前尝试使用的代码。

# Opening sequence.txt and making it to a string
seqfile = open(sequence, "r")
seqfile = seqfile.read().replace("\n", "")

# Regex for each STR
pattern1 = r"AGATC"
pattern2 = r"TTTTTTCT"
pattern3 = r"AATG"
pattern4 = r"TCTAG"
pattern5 = r"GATA"
pattern6 = r"TATC"
pattern7 = r"GAAA"
pattern8 = r"TCTG"

# 3 lists to store value for the loop. Whereas outercount is the final value of each amount of STR corresponding data list

outercount = [0, 0, 0, 0, 0, 0, 0, 0]
innercount = [0, 0, 0, 0, 0, 0, 0, 0]
secondcount = [0, 0, 0, 0, 0, 0, 0, 0]

# Looping through the sequence and checking if pattern matches, if it does update secondcounter by 1 and continue...
for i in seqfile:
if re.match(pattern1, seqfile):
secondcount[0] += 1
elif re.match(pattern2, seqfile):
secondcount[1] += 1
elif re.match(pattern3, seqfile):
secondcount[2] += 1
elif re.match(pattern4, seqfile):
secondcount[3] += 1
elif re.match(pattern5, seqfile):
secondcount[4] += 1
elif re.match(pattern6, seqfile):
secondcount[5] += 1
elif re.match(pattern7, seqfile):
secondcount[6] += 1
elif re.match(pattern8, seqfile):
secondcount[7] += 1

# Looping through outercount and checking if certain value at innercount is less than secondcount update values.
for i in outercount:
if secondcount[i] > innercount[i]:
#stop counting
innercount[i] = secondcount[i]
# Reset secondcounts value so that it doesn't continue counting if it is not consecutively
secondcount[i] = 0
# Checking if innercount is greater than outercount, if it is set outercount[i] to equal innercount[i] value
if innercount[i] > outercount[i]:
outercount[i] = innercount[i]

以下是序列文本文件的示例:

TGGTTTAGGGCCTATAATTGCAGGACCACTGGCCCTTGTCGAGGTGTACAGGTAGGGAGCTAAGTTCGAAACGCCCCTTGGTCGGGATTACCGCCAGATCAGATC...

请注意,文字比这多得多,但这仅供引用。因此,在本文中,我应该找到最多 8 个不同的 DNA 序列以及它们连续出现的数量。例如,查找模式 AGATC,然后计算它在一行中出现的最高次数。如果它首先在文本中的某处出现 3 次,然后又出现 6 次,那么我的 AGATC 计数器应该显示为 6,因为它是连续的最高数量。

所以,解释一下我的代码:我有 3 个不同数组的想法,我认为这不是最具可扩展性的解决方案,因为它可以是文本中的 3 或 8 个不同模式。但我认为从最大的金额开始,然后算出其余的可能会更容易。所以我尝试做的是为每个不同的模式创建一个正则表达式,然后检查是否可以在文本中找到每个模式,如果可以,我会将第二个计数列表更新到每个相应的索引。

然后与另一个循环比较 secondarycount[i] 处的金额是否大于 innercount[i] 以及是否将值更新为 innercount,然后重置 secondarycount[i],因为这可能是第二次计数的结束它连续出现的次数,然后如果它稍后再次出现在字符串中,那么它将从 0 开始计数等等...我想代码并不难理解,但是它不起作用所以...XD

有人对我如何实现这个有一些想法吗?

最佳答案

假设一个模式可以连续出现多次,我将按如下步骤计算一个模式在所有序列中的最大连续重复次数。

import re

with open(sequence_file, 'rt') as f:
rows = f.readlines()

patterns = {
re.compile("AGATC"): 0,
re.compile("TCTAG"): 0,
...
}

for r in rows:
for p in patterns:
prev_end = 0
freq = 0
for m in p.finditer(r):
span = m.span()
if span[0] != prev_end:
patterns[p] = max(freq, patterns[p])
freq = 0

prev_end = span[1]
freq += 1

if freq:
patterns[p] = max(freq, patterns[p])

注意:我还没有测试过这段代码。因此,请在使用之前使用已知的输入对其进行测试。

关于python - 计算模式在字符串中连续出现的最大数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59812979/

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