<p>还有其他可行的答案,但没有一个能解释你的实际问题。你实际上已经接近一个有效的解决方案,在我看来,什么是最可读的答案。在</p>
<p>错误来自这样一个事实,即在使用<code>range()</code>检查索引时,<strong>对同一个列表进行了变异。</strong></p>
<p>因此,在增加<code>i</code>变量时,您正在从列表中删除项,这在某一点上不可避免地导致<code>index error</code>。在</p>
<p>因此,这里是您的初始代码的一个工作版本</p>
<pre><code>pattern = ["ABCDE","ABCDEFG","ABCDEFGH","ABCDEFGHIJKLMNO","CEST","DBTSFDE","DBTSFDEO","EOEUDNBNUW","EAEUDNBNUW","FG","FGH"]
output_pattern = []
for i in range(0, (len(pattern)-1)):
if not pattern[i] in pattern[i+1]:
output_pattern.append(pattern[i])
# Adding the last item
output_pattern.append(pattern[-1])
print (output_pattern)
>>>> ['ABCDEFGHIJKLMNO', 'CEST', 'DBTSFDEO', 'EOEUDNBNUW', 'EAEUDNBNUW', 'FGH']
</code></pre>
<p>请注意,如果您的列表是按照您在注释部分中提到的那样进行排序的,则此代码将有效。在</p>
<p><strong>这段代码在做什么?</strong></p>
<p>基本上,它使用与初始答案相同的逻辑,在这个逻辑中迭代列表并检查下一项是否包含当前项。但是,使用另一个列表并迭代到<em>before last</em>项,可以解决索引问题。但现在有个问题</p>
<p>最后一项该怎么办?</em></p>
<p>由于列表是排序的,<strong>您可以认为最后一项始终是唯一的</strong>。这就是为什么我用</p>
^{pr2}$
<p>添加初始列表的最后一项。在</p>
<p><strong>重要提示</strong></p>
<p>这个答案是针对OP最初的问题写的,他想保持较长的重叠,我根据同一列表中的下一项引用<em>。正如@Chris_Rands所说,如果你的担忧与生物任务有关,并且需要找到任何重叠,那么这个解决方案不适合你的需要。在</p>
<p>此代码无法识别潜在重叠的示例</p>
<pre><code>pattern = ["ACD", "AD", "BACD"]
</code></pre>
<p>它将输出相同的结果而不删除可能的<code>"ACD"</code>重叠。现在,就像澄清一样,<strong>这意味着一个更复杂的算法</strong>,我最初认为这超出了问题的要求范围。如果这是你的情况,我可能完全错了,但是我真的认为C++实现似乎更合适。看看@Chris_Rands在评论部分建议的CD-Hit算法。在</p>