<p>一个想法是初始化一个Python dict,将每个2gram映射为零,并根据每一行递增。在这里,我假设FASQ文件只包含“ATGC”中的base。此外,对每一行的每一个可能对进行迭代需要对每一行进行16次遍历。这可以通过向前看并保存每一对来避免。或许如下:</p>
<pre><code>import random
def random_dnukes(lines=1000, cols=40):
return [''.join(random.choices('ATGC', k=cols)) for _ in range(lines)]
# e.g.
# ['TGACTCGTCAAAGGTACGTTAATCCTTGGGCAGTTACGGG',
# 'ATTGTTCAATCGAACGTTCGCTACTCGACTCGCGCCCCCT',
# 'TCCCGTGGGACAGGTTCCCAATTGACCGGACGCCGGACTC',
# 'TCGTCGTGCCCCGACATTGCTTCACGGCGGTGCGCGCTGG',
# 'GGTCCGGTCTAGGCGATCCCTAATAGTCAAGCACCGATTA',
# 'CCGAGCCTTGTGTATACTCTGTAAACACTTCTTCCCATAC',
# 'CGGATAGCAGCTAGTGGTTCCCGCAGTACAGGATGACCAA',
# 'CTCGGACGAGAAATCAGGCCAACCTCCACTGGCGACAGAA',
# 'TCTGACCTGCAGTGCAGTCCAGTTATAGTGGAACACCAGC',
# 'GTCAGCCCTTATCCGTTAGCCCAGGTGCCTCAATAGGAGG']
fake_file_iterator = iter(random_dnukes(1000, 40))
from collections import defaultdict
total_counts = defaultdict(int)
for line in fake_file_iterator:
line = line.strip()
for i in range(len(line) - 1):
total_counts[line[i:i+2]] += 1
for k, v in total_counts.items():
print(k, v)
</code></pre>
<p>导致</p>
<pre><code>GC 2497
CC 2382
CG 2444
GT 2422
TT 2508
TA 2373
AC 2466
GG 2408
TG 2473
CA 2462
AA 2412
CT 2448
AG 2454
GA 2470
TC 2400
AT 2381
</code></pre>