<p>您需要在循环</em>之外返回<em>,因为您将在第一个匹配中返回,所以您的列表中只有一个字符:</p>
<pre><code>def find(ch,string1):
pos = []
for i in range(len(string1)):
if ch == string1[i]:
pos.append(i)
return pos # outside
</code></pre>
<p>也可以使用<a href="https://docs.python.org/2/library/functions.html#enumerate" rel="nofollow">enumerate</a>和list comp来代替范围逻辑:</p>
<pre><code>def indexes(ch, s1):
return [index for index, char in enumerate(s1)if char == ch and 5 >= index <= len(s1) - 6]
</code></pre>
<p>列表comp中的每个<code>index</code>是字符索引,每个<code>char</code>是实际字符,因此我们保留char等于ch的每个索引</p>
<p>如果你想要两面的五个字符:</p>
<pre><code>In [24]: s="CFLVNLNADPALNELLVYYLKEHTLIGSANSQDIQLCGMGILPEHCIIDITSEGQVMLTP QKNTRTFVNGSSVSSPIQLHHGDRILWGNNHFFRLNLP"
In [25]: inds = indexes("C",s)
In [26]: [s[i-5:i+6] for i in inds]
Out[26]: ['QDIQLCGMGIL', 'ILPEHCIIDIT']
</code></pre>
<p>我添加了检查索引的功能,因为如果索引是<;5并且从末尾开始是相同的,那么显然我们无法在<code>C</code>之前获得5个字符。你知道吗</p>
<p>您可以在单个函数中完成这一切,在找到匹配项时生成一个切片:</p>
<pre><code>def find(ch, s):
ln = len(s)
for i, char in enumerate(s):
if ch == char and 5 <= i <= ln - 6:
yield s[i- 5:i + 6]
</code></pre>
<p>假设问题中的数据实际上是yoru文件中的两行:</p>
<pre><code>s="""">3fm8|A|A0JLQ2CFLVNLNADPALNELLVYYLKEHTLIGSANSQDIQLCGMGILPEHCIIDITSEGQVMLTPQKNTRTFVNGSSVSSPIQLHHGDRILWGNNHFFRLNLP
>2ht9|A|A0JLT0LATAPVNQIQETISDNCVVIFSKTSCSYCTMAKKLFHDMNVNYKVVELDLLEYGNQFQDALYKMTGERTVPRIFVNGTFIGGATDTHRLHKEGKLLPLVHQCY"""
</code></pre>
<p>跑步:</p>
<pre><code>for line in s.splitlines():
print(list(find("C" ,line)))
</code></pre>
<p>将输出:</p>
<pre><code>['0JLQ2CFLVNL', 'QDIQLCGMGIL', 'ILPEHCIIDIT']
['TISDNCVVIFS', 'FSKTSCSYCTM', 'TSCSYCTMAKK']
</code></pre>
<p>它给出了六个匹配项,而不是你预期的四个匹配项,所以我猜你没有包括所有可能的匹配项。你知道吗</p>
<p>您还可以使用<a href="https://docs.python.org/2/library/string.html#string.find" rel="nofollow">^{<cd4>}</a>加速代码,从最后一个匹配索引+1开始进行后续的每个匹配</p>
<pre><code>def find(ch, s):
ln, i = len(s) - 6, s.find(ch)
while 5 <= i <= ln:
yield s[i - 5:i + 6]
i = s.find(ch, i + 1)
</code></pre>
<p>这将产生相同的输出。当然,如果字符串不能重叠,您可以开始寻找下一个匹配的字符串更进一步每次。你知道吗</p>