工作,你需要返回循環外,你正在返回的第一場比賽,所以你永遠只能在你的清單得到一個單一的字符:
def find(ch,string1):
pos = []
for i in range(len(string1)):
if ch == string1[i]:
pos.append(i)
return pos # outside
def indexes(ch, s1):
return [index for index, char in enumerate(s1)if char == ch and 5 >= index <= len(s1) - 6]
每個index
列表中的補償:
您可以將您的範圍的邏輯也使用enumerate與列表比較是字符索引,並且每個char
都是實際的字符,所以我們保持每個索引的char等於ch。
如果你想五個字符兩者都是兩面:
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']
我加了檢查,因爲我們顯然不能C
前送五個字符如果該索引是< 5和終點都一樣的索引。
你可以做到這一切在一個單一的功能,產生一個切片,當你找到一個匹配:
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]
凡在你的問題假設的數據實際上是從夜兩行的文件,如:
s="""">3fm8|A|A0JLQ2CFLVNLNADPALNELLVYYLKEHTLIGSANSQDIQLCGMGILPEHCIIDITSEGQVMLTPQKNTRTFVNGSSVSSPIQLHHGDRILWGNNHFFRLNLP
>2ht9|A|A0JLT0LATAPVNQIQETISDNCVVIFSKTSCSYCTMAKKLFHDMNVNYKVVELDLLEYGNQFQDALYKMTGERTVPRIFVNGTFIGGATDTHRLHKEGKLLPLVHQCY"""
運行:
for line in s.splitlines():
print(list(find("C" ,line)))
將輸出:
['0JLQ2CFLVNL', 'QDIQLCGMGIL', 'ILPEHCIIDIT']
['TISDNCVVIFS', 'FSKTSCSYCTM', 'TSCSYCTMAKK']
這給出了六個匹配不是四個作爲您的預期輸出建議,所以我認爲你沒有包括所有可能的匹配。
您也可以加快使用str.find
代碼,開始最後一場比賽索引+ 1在每個後續比賽
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)
這將給相同的輸出。當然如果這些字符串不能重疊,你可以開始在每一次字符串中進一步查找下一個匹配。
實際上,我在這裏有用例需要指導。爲什麼不''TSCSYCTMAKK'而不是'FSKTSCSYCTM',或者這很重要? – Adib
我認爲我通過識別所有案例解決了這個問題 – Adib