二核苷酸计数和频率

时间:2016-09-15 04:18:09

标签: python dictionary bioinformatics sequences

我试图从文本文件中的序列中找到dinuc计数和频率,但我的代码只输出单核苷酸数。

e = "ecoli.txt"

ecnt = {}

with open(e) as seq:
    for line in seq:
        for word in line.split():
            for i in range(len(seqr)):
                dinuc = (seqr[i] + seqr[i:i+2])
                for dinuc in seqr:
                    if dinuc in ecnt:
                        ecnt[dinuc] += 1
                    else:
                        ecnt[dinuc] = 1  

for x,y in ecnt.items():
    print(x, y)

样本输入:“AAATTTCGTCGTTGCCC”

示例输出: AA:2 TT:3 TC:2 CG:2 GT:2 GC:1 CC:2

现在,我的输出只获得单个核苷酸:

C 83550600 A 60342100 T 88192300 G 92834000

对于重复即“AAA”的核苷酸,计数必须返回连续'AA'的所有可能组合,因此输出应该是2而不是1.无论列出二核苷酸的顺序如何,我只需要所有组合,以及代码返回重复核苷酸的正确计数。我问我的TA,她说我唯一的问题是让我的'for'循环将二核苷酸添加到我的字典中,我认为我的范围可能是也可能没有错。该文件非常大,因此序列被分成几行。

提前非常感谢!!!

2 个答案:

答案 0 :(得分:0)

我看了一下你的代码,发现了一些你可能想看的东西。

为了测试我的解决方案,因为我没有ecoli.txt,我使用随机核苷酸生成了我自己的一个,具有以下功能:

import random
def write_random_sequence():
    out_file = open("ecoli.txt", "w")
    num_nts = 500
    nts_per_line = 80
    nts = []
    for i in range(num_nts):
        nt = random.choice(["A", "T", "C", "G"])
        nts.append(nt)
    lines = [nts[i:i+nts_per_line] for i in range(0, len(nts), nts_per_line)]
    for line in lines:
        out_file.write("".join(line) + "\n")
    out_file.close()
write_random_sequence()

请注意,该文件具有500个核苷酸的单个序列,每个序列分成80个核苷酸的序列。为了计算在一行末端有第一个核苷酸而在下一行开头有第二个核苷酸的二核苷酸,我们需要将所有这些单独的行合并成一个单独的字符串,没有空格。让我们先做:

seq = ""
with open("ecoli.txt", "r") as seq_data:
    for line in seq_data:
        seq += line.strip()

尝试打印" seq"并注意它应该是一个包含所有核苷酸的巨大字符串。接下来,我们需要在序列串中找到二核苷酸。我们可以使用切片来做到这一点,我看到你试过了。因此,对于字符串中的每个位置,我们都会查看当前的核苷酸和之后的核苷酸。

for i in range(len(seq)-1):#note the -1
    dinuc = seq[i:i+2]

然后,我们可以在字典中对核苷酸进行计数和存储,并且#ec;"非常像你。最终代码如下所示:

ecnt = {}
seq = ""
with open("ecoli.txt", "r") as seq_data:
    for line in seq_data:
        seq += line.strip()
for i in range(len(seq)-1):
    dinuc = seq[i:i+2]
    if dinuc in ecnt:
        ecnt[dinuc] += 1
    else:
        ecnt[dinuc] = 1
print ecnt

答案 1 :(得分:0)

使用defaultdict

的绝佳机会
from collections import defaultdict

file_name = "ecoli.txt"

dinucleotide_counts = defaultdict(int)

sequence = ""

with open(file_name) as file:
    for line in file:
        sequence += line.strip()

for i in range(len(sequence) - 1):
    dinucleotide_counts[sequence[i:i + 2]] += 1

for key, value in sorted(dinucleotide_counts.items()):
    print(key, value)