<pre><code>s = 'ACGTTGCATGTCGCATGATGCATGAGAGCT'
length = 4
</code></pre>
<p>我会用字典来积累结果。使用切片提取下一个单词;在字典中为该单词的值添加一个;然后删除字符串中的第一个字符;当字符串中有单词时循环。在</p>
^{pr2}$
<p>您可能可以将<a href="https://docs.python.org/3/library/collections.html" rel="nofollow noreferrer">collections.Counter or collections.defaultdict</a>用于该位。如果单词不能重叠,请从字符串前面删除<code>length</code>个字符。当从循环底部的字符串中删除字符时,保持流程简单确实会导致效率低下。除非数据很长或过程执行了很多次,否则这不重要。在</p>
<p>然后找到频率最高的单词</p>
<pre><code>most = max(result.values())
frequent = []
for key, value in results:
if value == most:
frequent.append(key)
#frequent = [key for key, value in result.items() if value == most]
</code></pre>
<hr/>
<p>借用<a href="https://docs.python.org/3/library/itertools.html#itertools-recipes" rel="nofollow noreferrer">itertools recipe</a>可以创建一个迭代器,它生成所需长度的<em>单词</em></p>
<pre><code>def n_wise(iterable, n=2):
'''s -> (s0,s1), (s1,s2), (s2, s3), ... for n=2'''
tees = itertools.tee(iterable, n)
for i, thing in enumerate(tees, 1):
for _ in range(i):
next(thing, None)
return zip(*tees)
</code></pre>
<p>程序的计数部分将更改为</p>
<pre><code>words = n_wise(s, length)
result = {}
for word in words:
result[word] = result.get(word, 0) + 1
</code></pre>
<p><code>result</code>中的键将是元组,例如<code>('C', 'A', 'T', 'G')</code>,但是它们可以用<code>''.join(('C', 'A', 'T', 'G'))</code>来重构。在</p>